<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.4"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Flow: net_flow/server_socket.cpp Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr id="projectrow">
  <td id="projectalign">
   <div id="projectname">Flow<span id="projectnumber">&#160;2.0.0</span>
   </div>
   <div id="projectbrief">Flow project: Full implementation reference.</div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.4 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search",'Search','.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
  initMenu('',true,false,'search.php','Search');
  $(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div id="nav-path" class="navpath">
  <ul>
<li class="navelem"><a class="el" href="dir_460afd45d0ec637b1427e0e06a6fbcf7.html">net_flow</a></li>  </ul>
</div>
</div><!-- top -->
<div class="header">
  <div class="headertitle"><div class="title">server_socket.cpp</div></div>
</div><!--header-->
<div class="contents">
<a href="server__socket_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno">    1</span><span class="comment">/* Flow</span></div>
<div class="line"><a id="l00002" name="l00002"></a><span class="lineno">    2</span><span class="comment"> * Copyright 2023 Akamai Technologies, Inc.</span></div>
<div class="line"><a id="l00003" name="l00003"></a><span class="lineno">    3</span><span class="comment"> *</span></div>
<div class="line"><a id="l00004" name="l00004"></a><span class="lineno">    4</span><span class="comment"> * Licensed under the Apache License, Version 2.0 (the</span></div>
<div class="line"><a id="l00005" name="l00005"></a><span class="lineno">    5</span><span class="comment"> * &quot;License&quot;); you may not use this file except in</span></div>
<div class="line"><a id="l00006" name="l00006"></a><span class="lineno">    6</span><span class="comment"> * compliance with the License.  You may obtain a copy</span></div>
<div class="line"><a id="l00007" name="l00007"></a><span class="lineno">    7</span><span class="comment"> * of the License at</span></div>
<div class="line"><a id="l00008" name="l00008"></a><span class="lineno">    8</span><span class="comment"> *</span></div>
<div class="line"><a id="l00009" name="l00009"></a><span class="lineno">    9</span><span class="comment"> *   https://www.apache.org/licenses/LICENSE-2.0</span></div>
<div class="line"><a id="l00010" name="l00010"></a><span class="lineno">   10</span><span class="comment"> *</span></div>
<div class="line"><a id="l00011" name="l00011"></a><span class="lineno">   11</span><span class="comment"> * Unless required by applicable law or agreed to in</span></div>
<div class="line"><a id="l00012" name="l00012"></a><span class="lineno">   12</span><span class="comment"> * writing, software distributed under the License is</span></div>
<div class="line"><a id="l00013" name="l00013"></a><span class="lineno">   13</span><span class="comment"> * distributed on an &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR</span></div>
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno">   14</span><span class="comment"> * CONDITIONS OF ANY KIND, either express or implied.</span></div>
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno">   15</span><span class="comment"> * See the License for the specific language governing</span></div>
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno">   16</span><span class="comment"> * permissions and limitations under the License. */</span></div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno">   17</span><span class="comment"></span> </div>
<div class="line"><a id="l00018" name="l00018"></a><span class="lineno">   18</span><span class="comment">/// @file</span></div>
<div class="line"><a id="l00019" name="l00019"></a><span class="lineno">   19</span><span class="comment"></span><span class="preprocessor">#include &quot;<a class="code" href="node_8hpp.html">flow/net_flow/node.hpp</a>&quot;</span></div>
<div class="line"><a id="l00020" name="l00020"></a><span class="lineno">   20</span><span class="preprocessor">#include &quot;<a class="code" href="peer__socket_8hpp.html">flow/net_flow/peer_socket.hpp</a>&quot;</span></div>
<div class="line"><a id="l00021" name="l00021"></a><span class="lineno">   21</span><span class="preprocessor">#include &quot;<a class="code" href="bandwidth_8hpp.html">flow/net_flow/detail/stats/bandwidth.hpp</a>&quot;</span></div>
<div class="line"><a id="l00022" name="l00022"></a><span class="lineno">   22</span><span class="preprocessor">#include &quot;<a class="code" href="cong__ctl_8hpp.html">flow/net_flow/detail/cong_ctl.hpp</a>&quot;</span></div>
<div class="line"><a id="l00023" name="l00023"></a><span class="lineno">   23</span><span class="preprocessor">#include &quot;<a class="code" href="async_2util_8hpp.html">flow/async/util.hpp</a>&quot;</span></div>
<div class="line"><a id="l00024" name="l00024"></a><span class="lineno">   24</span> </div>
<div class="line"><a id="l00025" name="l00025"></a><span class="lineno">   25</span><span class="keyword">namespace </span><a class="code hl_namespace" href="namespaceflow_1_1net__flow.html">flow::net_flow</a></div>
<div class="line"><a id="l00026" name="l00026"></a><span class="lineno">   26</span>{</div>
<div class="line"><a id="l00027" name="l00027"></a><span class="lineno">   27</span> </div>
<div class="line"><a id="l00028" name="l00028"></a><span class="lineno">   28</span><span class="comment">// Server_socket implementation.</span></div>
<div class="line"><a id="l00029" name="l00029"></a><span class="lineno">   29</span> </div>
<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Server__socket.html#a1f48a72439665d8754549f11a4f4c7bb">   30</a></span><a class="code hl_function" href="classflow_1_1net__flow_1_1Server__socket.html#a1f48a72439665d8754549f11a4f4c7bb">Server_socket::Server_socket</a>(<a class="code hl_class" href="classflow_1_1log_1_1Logger.html">log::Logger</a>* logger_ptr, <span class="keyword">const</span> <a class="code hl_struct" href="structflow_1_1net__flow_1_1Peer__socket__options.html">Peer_socket_options</a>* child_sock_opts) :</div>
<div class="line"><a id="l00031" name="l00031"></a><span class="lineno">   31</span>  Log_context(logger_ptr, <a class="code hl_enumeration" href="namespaceflow.html#a3938730ab4b89daf13d027a5f620e7ce">Flow_log_component</a>::S_NET_FLOW),</div>
<div class="line"><a id="l00032" name="l00032"></a><span class="lineno">   32</span>  <span class="comment">/* If they supplied a Peer_socket_options, store a copy of it.  When new Peer_sockets are made</span></div>
<div class="line"><a id="l00033" name="l00033"></a><span class="lineno">   33</span><span class="comment">   * (when people connect to us), each peer socket&#39;s per-socket options will be copies of this.  If</span></div>
<div class="line"><a id="l00034" name="l00034"></a><span class="lineno">   34</span><span class="comment">   * they did not supply a Peer_socket_options, the Node&#39;s global Peer_socket_options will be used</span></div>
<div class="line"><a id="l00035" name="l00035"></a><span class="lineno">   35</span><span class="comment">   * for each subsequent Peer_socket. */</span></div>
<div class="line"><a id="l00036" name="l00036"></a><span class="lineno">   36</span>  m_child_sock_opts(child_sock_opts ? new <a class="code hl_struct" href="structflow_1_1net__flow_1_1Peer__socket__options.html">Peer_socket_options</a>(*child_sock_opts) : 0),</div>
<div class="line"><a id="l00037" name="l00037"></a><span class="lineno">   37</span>  m_state(<a class="code hl_enumeration" href="classflow_1_1net__flow_1_1Server__socket.html#a8bc789b851677a47d7c0a1aa0c69a997">State</a>::S_CLOSED), <span class="comment">// Incorrect; set explicitly.</span></div>
<div class="line"><a id="l00038" name="l00038"></a><span class="lineno">   38</span>  m_node(0), <span class="comment">// Incorrect; set explicitly.</span></div>
<div class="line"><a id="l00039" name="l00039"></a><span class="lineno">   39</span>  m_local_port(<a class="code hl_variable" href="namespaceflow_1_1net__flow.html#a9dd0c9d8de00fab78d8b0a3f50dad2a9">S_PORT_ANY</a>) <span class="comment">// Incorrect; set explicitly.</span></div>
<div class="line"><a id="l00040" name="l00040"></a><span class="lineno">   40</span>{</div>
<div class="line"><a id="l00041" name="l00041"></a><span class="lineno">   41</span>  <span class="comment">// Only print pointer value, because most members are garbage at this point.</span></div>
<div class="line"><a id="l00042" name="l00042"></a><span class="lineno">   42</span>  <a class="code hl_define" href="log_8hpp.html#affcf2e4c496ce3f42adf981669c623b8">FLOW_LOG_TRACE</a>(<span class="stringliteral">&quot;Server_socket [&quot;</span> &lt;&lt; <span class="keyword">static_cast&lt;</span><span class="keywordtype">void</span>*<span class="keyword">&gt;</span>(<span class="keyword">this</span>) &lt;&lt; <span class="stringliteral">&quot;] created.&quot;</span>);</div>
<div class="line"><a id="l00043" name="l00043"></a><span class="lineno">   43</span>}</div>
<div class="line"><a id="l00044" name="l00044"></a><span class="lineno">   44</span> </div>
<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Server__socket.html#acafb67ed1f81b90f3b2ab923de4e0525">   45</a></span><a class="code hl_function" href="classflow_1_1net__flow_1_1Server__socket.html#acafb67ed1f81b90f3b2ab923de4e0525">Server_socket::~Server_socket</a>()</div>
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno">   46</span>{</div>
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno">   47</span>  <span class="keyword">delete</span> <a class="code hl_variable" href="classflow_1_1net__flow_1_1Server__socket.html#a771900a26d8774a88f1f65b8910cf9d2">m_child_sock_opts</a>; <span class="comment">// May be 0 (that&#39;s okay).</span></div>
<div class="line"><a id="l00048" name="l00048"></a><span class="lineno">   48</span> </div>
<div class="line"><a id="l00049" name="l00049"></a><span class="lineno">   49</span>  <a class="code hl_define" href="log_8hpp.html#affcf2e4c496ce3f42adf981669c623b8">FLOW_LOG_TRACE</a>(<span class="stringliteral">&quot;Server_socket [&quot;</span> &lt;&lt; <span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;] destroyed.&quot;</span>);</div>
<div class="line"><a id="l00050" name="l00050"></a><span class="lineno">   50</span>}</div>
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno">   51</span> </div>
<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Server__socket.html#ab2683ecde1fac2b0a79a957de1a2a8ff">   52</a></span><a class="code hl_enumeration" href="classflow_1_1net__flow_1_1Server__socket.html#a8bc789b851677a47d7c0a1aa0c69a997">Server_socket::State</a> <a class="code hl_function" href="classflow_1_1net__flow_1_1Server__socket.html#ab2683ecde1fac2b0a79a957de1a2a8ff">Server_socket::state</a>()<span class="keyword"> const</span></div>
<div class="line"><a id="l00053" name="l00053"></a><span class="lineno">   53</span><span class="keyword"></span>{</div>
<div class="line"><a id="l00054" name="l00054"></a><span class="lineno">   54</span>  <a class="code hl_typedef" href="classflow_1_1net__flow_1_1Server__socket.html#ad428b65f60ee317aff7a0ad7f7a8f56d">Lock_guard</a> lock(<a class="code hl_variable" href="classflow_1_1net__flow_1_1Server__socket.html#a40967c1981ffde4f7b75c6bb5e5b279b">m_mutex</a>); <span class="comment">// State is liable to change at any time.</span></div>
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno">   55</span>  <span class="keywordflow">return</span> <a class="code hl_variable" href="classflow_1_1net__flow_1_1Server__socket.html#a783f81f10b50f62a638aa26b72d49e36">m_state</a>;</div>
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno">   56</span>}</div>
<div class="line"><a id="l00057" name="l00057"></a><span class="lineno">   57</span> </div>
<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Server__socket.html#ae22e94978d59dfe23559a254349670bd">   58</a></span><a class="code hl_class" href="classflow_1_1net__flow_1_1Node.html">Node</a>* <a class="code hl_function" href="classflow_1_1net__flow_1_1Server__socket.html#ae22e94978d59dfe23559a254349670bd">Server_socket::node</a>()<span class="keyword"> const</span></div>
<div class="line"><a id="l00059" name="l00059"></a><span class="lineno">   59</span><span class="keyword"></span>{</div>
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno">   60</span>  <a class="code hl_typedef" href="classflow_1_1net__flow_1_1Server__socket.html#ad428b65f60ee317aff7a0ad7f7a8f56d">Lock_guard</a> lock(<a class="code hl_variable" href="classflow_1_1net__flow_1_1Server__socket.html#a40967c1981ffde4f7b75c6bb5e5b279b">m_mutex</a>); <span class="comment">// m_node can simultaneously change to 0 if state changes to S_CLOSED.</span></div>
<div class="line"><a id="l00061" name="l00061"></a><span class="lineno">   61</span>  <span class="keywordflow">return</span> <a class="code hl_variable" href="classflow_1_1net__flow_1_1Server__socket.html#a8e8e3363803b2fe2c862b9fac1dfbb77">m_node</a>;</div>
<div class="line"><a id="l00062" name="l00062"></a><span class="lineno">   62</span>}</div>
<div class="line"><a id="l00063" name="l00063"></a><span class="lineno">   63</span> </div>
<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Server__socket.html#a6ba400221e347613c0d101b19602a3a2">   64</a></span><a class="code hl_typedef" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09">Error_code</a> <a class="code hl_function" href="classflow_1_1net__flow_1_1Server__socket.html#a6ba400221e347613c0d101b19602a3a2">Server_socket::disconnect_cause</a>()<span class="keyword"> const</span></div>
<div class="line"><a id="l00065" name="l00065"></a><span class="lineno">   65</span><span class="keyword"></span>{</div>
<div class="line"><a id="l00066" name="l00066"></a><span class="lineno">   66</span>  <a class="code hl_typedef" href="classflow_1_1net__flow_1_1Server__socket.html#ad428b65f60ee317aff7a0ad7f7a8f56d">Lock_guard</a> lock(<a class="code hl_variable" href="classflow_1_1net__flow_1_1Server__socket.html#a40967c1981ffde4f7b75c6bb5e5b279b">m_mutex</a>);</div>
<div class="line"><a id="l00067" name="l00067"></a><span class="lineno">   67</span>  <span class="keywordflow">return</span> <a class="code hl_variable" href="classflow_1_1net__flow_1_1Server__socket.html#ae87a97dcfaa0909789b76ef4462d6a0b">m_disconnect_cause</a>;</div>
<div class="line"><a id="l00068" name="l00068"></a><span class="lineno">   68</span>}</div>
<div class="line"><a id="l00069" name="l00069"></a><span class="lineno">   69</span> </div>
<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Server__socket.html#acd7b6b9c66eee2f3bbf35ac1068b1cb1">   70</a></span><a class="code hl_typedef" href="namespaceflow_1_1net__flow.html#a079d8cd87a68d1c5f04c6bce71f0061d">flow_port_t</a> <a class="code hl_function" href="classflow_1_1net__flow_1_1Server__socket.html#acd7b6b9c66eee2f3bbf35ac1068b1cb1">Server_socket::local_port</a>()<span class="keyword"> const</span></div>
<div class="line"><a id="l00071" name="l00071"></a><span class="lineno">   71</span><span class="keyword"></span>{</div>
<div class="line"><a id="l00072" name="l00072"></a><span class="lineno">   72</span>  <span class="keywordflow">return</span> <a class="code hl_variable" href="classflow_1_1net__flow_1_1Server__socket.html#ac36eb28d50496b3f8f1b9790194e825e">m_local_port</a>; <span class="comment">// No need to lock (it never changes).</span></div>
<div class="line"><a id="l00073" name="l00073"></a><span class="lineno">   73</span>}</div>
<div class="line"><a id="l00074" name="l00074"></a><span class="lineno">   74</span> </div>
<div class="line"><a id="l00075" name="l00075"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Server__socket.html#aeea8554e23c8d743ca4956c772adbf24">   75</a></span><a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Peer_socket::Ptr</a> <a class="code hl_function" href="classflow_1_1net__flow_1_1Server__socket.html#aeea8554e23c8d743ca4956c772adbf24">Server_socket::accept</a>(<a class="code hl_typedef" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09">Error_code</a>* err_code)</div>
<div class="line"><a id="l00076" name="l00076"></a><span class="lineno">   76</span>{</div>
<div class="line"><a id="l00077" name="l00077"></a><span class="lineno">   77</span>  <a class="code hl_define" href="error_2error_8hpp.html#a636b2d30a8785df6e84646b568bce9b5">FLOW_ERROR_EXEC_AND_THROW_ON_ERROR</a>(<a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Peer_socket::Ptr</a>, <a class="code hl_function" href="classflow_1_1net__flow_1_1Server__socket.html#aeea8554e23c8d743ca4956c772adbf24">accept</a>, _1);</div>
<div class="line"><a id="l00078" name="l00078"></a><span class="lineno">   78</span>  <span class="comment">// ^-- Call ourselves and return if err_code is null.  If got to present line, err_code is not null.</span></div>
<div class="line"><a id="l00079" name="l00079"></a><span class="lineno">   79</span> </div>
<div class="line"><a id="l00080" name="l00080"></a><span class="lineno">   80</span>  <span class="comment">// We are in user thread U != W.</span></div>
<div class="line"><a id="l00081" name="l00081"></a><span class="lineno">   81</span> </div>
<div class="line"><a id="l00082" name="l00082"></a><span class="lineno">   82</span>  <a class="code hl_typedef" href="classflow_1_1net__flow_1_1Server__socket.html#ad428b65f60ee317aff7a0ad7f7a8f56d">Lock_guard</a> lock(<a class="code hl_variable" href="classflow_1_1net__flow_1_1Server__socket.html#a40967c1981ffde4f7b75c6bb5e5b279b">m_mutex</a>);</div>
<div class="line"><a id="l00083" name="l00083"></a><span class="lineno">   83</span> </div>
<div class="line"><a id="l00084" name="l00084"></a><span class="lineno">   84</span>  <span class="keyword">const</span> <a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Ptr</a> serv = shared_from_this();</div>
<div class="line"><a id="l00085" name="l00085"></a><span class="lineno">   85</span>  <span class="keywordflow">if</span> (!<a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#a109a118ca312e94686595ea08dac7ad0">Node::ensure_sock_open</a>(serv, err_code)) <span class="comment">// Ensure it&#39;s open, so that we can access m_node.</span></div>
<div class="line"><a id="l00086" name="l00086"></a><span class="lineno">   86</span>  {</div>
<div class="line"><a id="l00087" name="l00087"></a><span class="lineno">   87</span>    <span class="keywordflow">return</span> <a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Peer_socket::Ptr</a>();</div>
<div class="line"><a id="l00088" name="l00088"></a><span class="lineno">   88</span>  }</div>
<div class="line"><a id="l00089" name="l00089"></a><span class="lineno">   89</span>  <span class="comment">// else m_node is valid.</span></div>
<div class="line"><a id="l00090" name="l00090"></a><span class="lineno">   90</span> </div>
<div class="line"><a id="l00091" name="l00091"></a><span class="lineno">   91</span>  <span class="comment">// Forward the rest of the logic to Node, as is the general convention especially for logic affecting outside *this.</span></div>
<div class="line"><a id="l00092" name="l00092"></a><span class="lineno">   92</span>  <span class="keywordflow">return</span> <a class="code hl_variable" href="classflow_1_1net__flow_1_1Server__socket.html#a8e8e3363803b2fe2c862b9fac1dfbb77">m_node</a>-&gt;<a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#ac3c67514c259404de3f27a8cae8b0567">accept</a>(serv, err_code);</div>
<div class="line"><a id="l00093" name="l00093"></a><span class="lineno">   93</span>} <span class="comment">// Server_socket::accept()</span></div>
<div class="line"><a id="l00094" name="l00094"></a><span class="lineno">   94</span> </div>
<div class="line"><a id="l00095" name="l00095"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Server__socket.html#a5bbf25d3921f6b9cbba463ef5a93d1e4">   95</a></span><a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Peer_socket::Ptr</a> <a class="code hl_function" href="classflow_1_1net__flow_1_1Server__socket.html#a02ba529163a2d50132eff7aec9d9c9b8">Server_socket::sync_accept</a>(<span class="keywordtype">bool</span> reactor_pattern, <a class="code hl_typedef" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09">Error_code</a>* err_code)</div>
<div class="line"><a id="l00096" name="l00096"></a><span class="lineno">   96</span>{</div>
<div class="line"><a id="l00097" name="l00097"></a><span class="lineno">   97</span>  <span class="keywordflow">return</span> <a class="code hl_function" href="classflow_1_1net__flow_1_1Server__socket.html#a7f374375e95e008cfe0326ecfb27cf3b">sync_accept_impl</a>(<a class="code hl_typedef" href="namespaceflow.html#a9d9cc2eeb10d398cff5591d446b763b8">Fine_time_pt</a>(), reactor_pattern, err_code);</div>
<div class="line"><a id="l00098" name="l00098"></a><span class="lineno">   98</span>}</div>
<div class="line"><a id="l00099" name="l00099"></a><span class="lineno">   99</span> </div>
<div class="line"><a id="l00100" name="l00100"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Server__socket.html#a7f374375e95e008cfe0326ecfb27cf3b">  100</a></span><a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Peer_socket::Ptr</a> <a class="code hl_function" href="classflow_1_1net__flow_1_1Server__socket.html#a7f374375e95e008cfe0326ecfb27cf3b">Server_socket::sync_accept_impl</a>(<span class="keyword">const</span> <a class="code hl_typedef" href="namespaceflow.html#a9d9cc2eeb10d398cff5591d446b763b8">Fine_time_pt</a>&amp; wait_until, <span class="keywordtype">bool</span> reactor_pattern,</div>
<div class="line"><a id="l00101" name="l00101"></a><span class="lineno">  101</span>                                                 <a class="code hl_typedef" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09">Error_code</a>* err_code)</div>
<div class="line"><a id="l00102" name="l00102"></a><span class="lineno">  102</span>{</div>
<div class="line"><a id="l00103" name="l00103"></a><span class="lineno">  103</span>  <span class="keyword">using </span>boost::adopt_lock;</div>
<div class="line"><a id="l00104" name="l00104"></a><span class="lineno">  104</span> </div>
<div class="line"><a id="l00105" name="l00105"></a><span class="lineno">  105</span>  <a class="code hl_define" href="error_2error_8hpp.html#a636b2d30a8785df6e84646b568bce9b5">FLOW_ERROR_EXEC_AND_THROW_ON_ERROR</a>(<a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Peer_socket::Ptr</a>, <a class="code hl_function" href="classflow_1_1net__flow_1_1Server__socket.html#a7f374375e95e008cfe0326ecfb27cf3b">sync_accept_impl</a>, wait_until, reactor_pattern, _1);</div>
<div class="line"><a id="l00106" name="l00106"></a><span class="lineno">  106</span>  <span class="comment">// ^-- Call ourselves and return if err_code is null.  If got to present line, err_code is not null.</span></div>
<div class="line"><a id="l00107" name="l00107"></a><span class="lineno">  107</span> </div>
<div class="line"><a id="l00108" name="l00108"></a><span class="lineno">  108</span>  <span class="comment">// We are in user thread U != W.</span></div>
<div class="line"><a id="l00109" name="l00109"></a><span class="lineno">  109</span> </div>
<div class="line"><a id="l00110" name="l00110"></a><span class="lineno">  110</span>  <a class="code hl_typedef" href="classflow_1_1net__flow_1_1Server__socket.html#ad428b65f60ee317aff7a0ad7f7a8f56d">Lock_guard</a> lock(<a class="code hl_variable" href="classflow_1_1net__flow_1_1Server__socket.html#a40967c1981ffde4f7b75c6bb5e5b279b">m_mutex</a>);</div>
<div class="line"><a id="l00111" name="l00111"></a><span class="lineno">  111</span> </div>
<div class="line"><a id="l00112" name="l00112"></a><span class="lineno">  112</span>  <span class="keyword">const</span> <a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Ptr</a> serv = shared_from_this();</div>
<div class="line"><a id="l00113" name="l00113"></a><span class="lineno">  113</span>  <span class="keywordflow">if</span> (!<a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#a109a118ca312e94686595ea08dac7ad0">Node::ensure_sock_open</a>(serv, err_code)) <span class="comment">// Ensure it&#39;s open, so that we can access m_node.</span></div>
<div class="line"><a id="l00114" name="l00114"></a><span class="lineno">  114</span>  {</div>
<div class="line"><a id="l00115" name="l00115"></a><span class="lineno">  115</span>    <span class="keywordflow">return</span> <a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Peer_socket::Ptr</a>();</div>
<div class="line"><a id="l00116" name="l00116"></a><span class="lineno">  116</span>  }</div>
<div class="line"><a id="l00117" name="l00117"></a><span class="lineno">  117</span>  <span class="comment">// else m_node is valid.</span></div>
<div class="line"><a id="l00118" name="l00118"></a><span class="lineno">  118</span> </div>
<div class="line"><a id="l00119" name="l00119"></a><span class="lineno">  119</span>  lock.release(); <span class="comment">// Release lock (mutex is still LOCKED).  sync_op() takes over holding the lock and unlocking.</span></div>
<div class="line"><a id="l00120" name="l00120"></a><span class="lineno">  120</span> </div>
<div class="line"><a id="l00121" name="l00121"></a><span class="lineno">  121</span>  <span class="comment">// See comment in Peer_socket::node_sync_send().</span></div>
<div class="line"><a id="l00122" name="l00122"></a><span class="lineno">  122</span> </div>
<div class="line"><a id="l00123" name="l00123"></a><span class="lineno">  123</span>  <span class="comment">/* Operating on Server_sockets, returning Peer_socket::Ptr; Event_set socket set type is</span></div>
<div class="line"><a id="l00124" name="l00124"></a><span class="lineno">  124</span><span class="comment">   * Server_sockets.</span></div>
<div class="line"><a id="l00125" name="l00125"></a><span class="lineno">  125</span><span class="comment">   * Object is serv; non-blocking operation is m_node-&gt;accept(...) -- or N/A in &quot;reactor pattern&quot; mode..</span></div>
<div class="line"><a id="l00126" name="l00126"></a><span class="lineno">  126</span><span class="comment">   * Peer_socket::Ptr() is the &quot;would-block&quot; return value for this operation.</span></div>
<div class="line"><a id="l00127" name="l00127"></a><span class="lineno">  127</span><span class="comment">   * S_SERVER_SOCKET_ACCEPTABLE is the type of event to watch for here. */</span></div>
<div class="line"><a id="l00128" name="l00128"></a><span class="lineno">  128</span>  <span class="keywordflow">return</span> <a class="code hl_variable" href="classflow_1_1net__flow_1_1Server__socket.html#a8e8e3363803b2fe2c862b9fac1dfbb77">m_node</a></div>
<div class="line"><a id="l00129" name="l00129"></a><span class="lineno">  129</span>           -&gt;<a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#a2a4dc3d8e294bbc8423e111f52e414ae">sync_op</a>&lt;<a class="code hl_function" href="classflow_1_1net__flow_1_1Server__socket.html#a1f48a72439665d8754549f11a4f4c7bb">Server_socket</a>, <a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Peer_socket::Ptr</a>&gt;</div>
<div class="line"><a id="l00130" name="l00130"></a><span class="lineno">  130</span>               (serv,</div>
<div class="line"><a id="l00131" name="l00131"></a><span class="lineno">  131</span>                reactor_pattern</div>
<div class="line"><a id="l00132" name="l00132"></a><span class="lineno">  132</span>                  ? <a class="code hl_class" href="classflow_1_1Function.html">Function&lt;Peer_socket::Ptr ()&gt;</a>()</div>
<div class="line"><a id="l00133" name="l00133"></a><span class="lineno">  133</span>                  : <a class="code hl_class" href="classflow_1_1Function.html">Function&lt;Peer_socket::Ptr ()&gt;</a>([<span class="keyword">this</span>, serv, err_code]() -&gt; <a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Peer_socket::Ptr</a></div>
<div class="line"><a id="l00134" name="l00134"></a><span class="lineno">  134</span>                                                    { <span class="keywordflow">return</span> <a class="code hl_variable" href="classflow_1_1net__flow_1_1Server__socket.html#a8e8e3363803b2fe2c862b9fac1dfbb77">m_node</a>-&gt;<a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#ac3c67514c259404de3f27a8cae8b0567">accept</a>(serv, err_code); }),</div>
<div class="line"><a id="l00135" name="l00135"></a><span class="lineno">  135</span>                <a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Peer_socket::Ptr</a>(), <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a19cc3a286c8a11c986d2a59ec1e39a71afb218b0110d3f9f26ee089bad2e0eba2">Event_set::Event_type::S_SERVER_SOCKET_ACCEPTABLE</a>,</div>
<div class="line"><a id="l00136" name="l00136"></a><span class="lineno">  136</span>                wait_until, err_code);</div>
<div class="line"><a id="l00137" name="l00137"></a><span class="lineno">  137</span>} <span class="comment">// Server_socket::sync_accept_impl()</span></div>
<div class="line"><a id="l00138" name="l00138"></a><span class="lineno">  138</span> </div>
<div class="line"><a id="l00139" name="l00139"></a><span class="lineno">  139</span><span class="comment">// Node implementations (methods dealing with individual Server_sockets).</span></div>
<div class="line"><a id="l00140" name="l00140"></a><span class="lineno">  140</span> </div>
<div class="line"><a id="l00141" name="l00141"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Node.html#a3c2cd6a6c328a2d5381308258d35d95d">  141</a></span><a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Server_socket::Ptr</a> <a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#a3c2cd6a6c328a2d5381308258d35d95d">Node::listen</a>(<a class="code hl_typedef" href="namespaceflow_1_1net__flow.html#a079d8cd87a68d1c5f04c6bce71f0061d">flow_port_t</a> local_port, <a class="code hl_typedef" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09">Error_code</a>* err_code,</div>
<div class="line"><a id="l00142" name="l00142"></a><span class="lineno">  142</span>                                <span class="keyword">const</span> <a class="code hl_struct" href="structflow_1_1net__flow_1_1Peer__socket__options.html">Peer_socket_options</a>* child_sock_opts)</div>
<div class="line"><a id="l00143" name="l00143"></a><span class="lineno">  143</span>{</div>
<div class="line"><a id="l00144" name="l00144"></a><span class="lineno">  144</span>  <a class="code hl_define" href="error_2error_8hpp.html#a636b2d30a8785df6e84646b568bce9b5">FLOW_ERROR_EXEC_AND_THROW_ON_ERROR</a>(<a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Server_socket::Ptr</a>, <a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#a3c2cd6a6c328a2d5381308258d35d95d">listen</a>, local_port, _1, child_sock_opts);</div>
<div class="line"><a id="l00145" name="l00145"></a><span class="lineno">  145</span>  <span class="comment">// ^-- Call ourselves and return if err_code is null.  If got to present line, err_code is not null.</span></div>
<div class="line"><a id="l00146" name="l00146"></a><span class="lineno">  146</span> </div>
<div class="line"><a id="l00147" name="l00147"></a><span class="lineno">  147</span>  <span class="keyword">using </span><a class="code hl_function" href="namespaceflow_1_1async.html#a24567271e97a67d3cae6bd8bf8dc63c4">async::asio_exec_ctx_post</a>;</div>
<div class="line"><a id="l00148" name="l00148"></a><span class="lineno">  148</span>  <span class="keyword">using </span><a class="code hl_enumeration" href="namespaceflow_1_1async.html#a0a06794b16b72f2829ce3353557c8485">async::Synchronicity</a>;</div>
<div class="line"><a id="l00149" name="l00149"></a><span class="lineno">  149</span>  <span class="keyword">using </span>boost::promise;</div>
<div class="line"><a id="l00150" name="l00150"></a><span class="lineno">  150</span>  <span class="keyword">using </span>boost::unique_future;</div>
<div class="line"><a id="l00151" name="l00151"></a><span class="lineno">  151</span> </div>
<div class="line"><a id="l00152" name="l00152"></a><span class="lineno">  152</span>  <span class="comment">// We are in thread U != W.</span></div>
<div class="line"><a id="l00153" name="l00153"></a><span class="lineno">  153</span> </div>
<div class="line"><a id="l00154" name="l00154"></a><span class="lineno">  154</span>  <span class="keywordflow">if</span> (!<a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#aae148cec361b59237996a4b30c6624b5">running</a>())</div>
<div class="line"><a id="l00155" name="l00155"></a><span class="lineno">  155</span>  {</div>
<div class="line"><a id="l00156" name="l00156"></a><span class="lineno">  156</span>    <a class="code hl_define" href="error_2error_8hpp.html#ab6b8ed79012c994cfc381e0b92c066fd">FLOW_ERROR_EMIT_ERROR</a>(<a class="code hl_enumvalue" href="namespaceflow_1_1net__flow_1_1error.html#a18e13de77b119ea0f2be411490859482affac5d80b4e72f2e55bbbfadce2efd2e">error::Code::S_NODE_NOT_RUNNING</a>);</div>
<div class="line"><a id="l00157" name="l00157"></a><span class="lineno">  157</span>    <span class="keywordflow">return</span> <a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Server_socket::Ptr</a>();</div>
<div class="line"><a id="l00158" name="l00158"></a><span class="lineno">  158</span>  }</div>
<div class="line"><a id="l00159" name="l00159"></a><span class="lineno">  159</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l00160" name="l00160"></a><span class="lineno">  160</span> </div>
<div class="line"><a id="l00161" name="l00161"></a><span class="lineno">  161</span>  <span class="comment">/* Basically we now need to do the following.</span></div>
<div class="line"><a id="l00162" name="l00162"></a><span class="lineno">  162</span><span class="comment">   *   -1- Reserve local_port in m_ports.</span></div>
<div class="line"><a id="l00163" name="l00163"></a><span class="lineno">  163</span><span class="comment">   *   -2- Create Server_socket serv.</span></div>
<div class="line"><a id="l00164" name="l00164"></a><span class="lineno">  164</span><span class="comment">   *   -3- Save serv in m_servs.</span></div>
<div class="line"><a id="l00165" name="l00165"></a><span class="lineno">  165</span><span class="comment">   *   (Both -1- and -3- can result in error.)</span></div>
<div class="line"><a id="l00166" name="l00166"></a><span class="lineno">  166</span><span class="comment">   *</span></div>
<div class="line"><a id="l00167" name="l00167"></a><span class="lineno">  167</span><span class="comment">   * -2- must be done in thread W, as m_servs is by design only to be accessed there.  -1-, however,</span></div>
<div class="line"><a id="l00168" name="l00168"></a><span class="lineno">  168</span><span class="comment">   * can be done in thread U, assuming m_ports is properly synchronized.  So here are our choices:</span></div>
<div class="line"><a id="l00169" name="l00169"></a><span class="lineno">  169</span><span class="comment">   *</span></div>
<div class="line"><a id="l00170" name="l00170"></a><span class="lineno">  170</span><span class="comment">   * I. Perform -1- in U.  If error, return.  Perform -2-.  Post callback to do -3- in W.  Return</span></div>
<div class="line"><a id="l00171" name="l00171"></a><span class="lineno">  171</span><span class="comment">   *    serv in U.  Meanwhile -2- will, at some point, be performed in W.  If error in -3-, save it</span></div>
<div class="line"><a id="l00172" name="l00172"></a><span class="lineno">  172</span><span class="comment">   *    in serv.  User will discover when trying to serv-&gt;accept().</span></div>
<div class="line"><a id="l00173" name="l00173"></a><span class="lineno">  173</span><span class="comment">   *</span></div>
<div class="line"><a id="l00174" name="l00174"></a><span class="lineno">  174</span><span class="comment">   * II. Perform -1- in U.  If error, return.  Perform -2-.  Post callback to do -3- in W.  Use a</span></div>
<div class="line"><a id="l00175" name="l00175"></a><span class="lineno">  175</span><span class="comment">   *     future/promise pair to wait for -3- to complete.  Meanwhile -3- will, at some point, be performed</span></div>
<div class="line"><a id="l00176" name="l00176"></a><span class="lineno">  176</span><span class="comment">   *     in W.  If error in -3-, save it in serv.  Either way, U will wait for the result and return</span></div>
<div class="line"><a id="l00177" name="l00177"></a><span class="lineno">  177</span><span class="comment">   *     error or serv to the user.</span></div>
<div class="line"><a id="l00178" name="l00178"></a><span class="lineno">  178</span><span class="comment">   *</span></div>
<div class="line"><a id="l00179" name="l00179"></a><span class="lineno">  179</span><span class="comment">   * III. Post callback to do -1-, -2-, -3- in W.  Use a future/promise pair to wait for -1-3- to complete.</span></div>
<div class="line"><a id="l00180" name="l00180"></a><span class="lineno">  180</span><span class="comment">   *      Meanwhile -1-3- will, at some point, be performed in W.  If error in -1-3-, save it in</span></div>
<div class="line"><a id="l00181" name="l00181"></a><span class="lineno">  181</span><span class="comment">   *      serv.  Either way, U will wait.  If error, return error to the user.  Else return serv to</span></div>
<div class="line"><a id="l00182" name="l00182"></a><span class="lineno">  182</span><span class="comment">   *      the user.</span></div>
<div class="line"><a id="l00183" name="l00183"></a><span class="lineno">  183</span><span class="comment">   *</span></div>
<div class="line"><a id="l00184" name="l00184"></a><span class="lineno">  184</span><span class="comment">   * Let&#39;s pick one.  III &gt; II due to simpler code; future used either way but most code is in one</span></div>
<div class="line"><a id="l00185" name="l00185"></a><span class="lineno">  185</span><span class="comment">   * thread and one function (the W callback); the U part is a short wrapper.  Also, Port_space need</span></div>
<div class="line"><a id="l00186" name="l00186"></a><span class="lineno">  186</span><span class="comment">   * not be synchronized.  So it&#39;s I vs. III.  Advantage of I is speed; listen() will return in U</span></div>
<div class="line"><a id="l00187" name="l00187"></a><span class="lineno">  187</span><span class="comment">   * faster, especially if thread W is loaded with work.  (However III is still non-blocking, i.e.,</span></div>
<div class="line"><a id="l00188" name="l00188"></a><span class="lineno">  188</span><span class="comment">   * no waiting for network events.)  Advantage of III is simplicity of code (everything in one</span></div>
<div class="line"><a id="l00189" name="l00189"></a><span class="lineno">  189</span><span class="comment">   * thread and callback, in W; no explicit locking); and any pre-networking error is immediately</span></div>
<div class="line"><a id="l00190" name="l00190"></a><span class="lineno">  190</span><span class="comment">   * returned by listen() instead of being discovered later.  I believe here III wins, especially</span></div>
<div class="line"><a id="l00191" name="l00191"></a><span class="lineno">  191</span><span class="comment">   * because listen() should be fairly infrequent, so a split second speed difference should not be</span></div>
<div class="line"><a id="l00192" name="l00192"></a><span class="lineno">  192</span><span class="comment">   * significant.</span></div>
<div class="line"><a id="l00193" name="l00193"></a><span class="lineno">  193</span><span class="comment">   *</span></div>
<div class="line"><a id="l00194" name="l00194"></a><span class="lineno">  194</span><span class="comment">   * So we choose III.  We set up connect_worker() to run in W and wait for</span></div>
<div class="line"><a id="l00195" name="l00195"></a><span class="lineno">  195</span><span class="comment">   * it to succeed or fail.  asio_exec_ctx_post() does the promise/future stuff, or equivalent, so</span></div>
<div class="line"><a id="l00196" name="l00196"></a><span class="lineno">  196</span><span class="comment">   * the code is really simple. */</span></div>
<div class="line"><a id="l00197" name="l00197"></a><span class="lineno">  197</span> </div>
<div class="line"><a id="l00198" name="l00198"></a><span class="lineno">  198</span>  <span class="comment">// Load this onto thread W boost.asio work queue.  We won&#39;t return until it&#39;s done, so [&amp;] is OK.</span></div>
<div class="line"><a id="l00199" name="l00199"></a><span class="lineno">  199</span>  <a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Server_socket::Ptr</a> serv;</div>
<div class="line"><a id="l00200" name="l00200"></a><span class="lineno">  200</span>  <a class="code hl_function" href="namespaceflow_1_1async.html#a24567271e97a67d3cae6bd8bf8dc63c4">asio_exec_ctx_post</a>(<a class="code hl_function" href="classflow_1_1log_1_1Log__context.html#af4db395042b065b00398cd59845dcb4d">get_logger</a>(), &amp;<a class="code hl_variable" href="classflow_1_1net__flow_1_1Node.html#af5597a417d03e2bed87cd772ef5cef29">m_task_engine</a>, Synchronicity::S_ASYNC_AND_AWAIT_CONCURRENT_COMPLETION,</div>
<div class="line"><a id="l00201" name="l00201"></a><span class="lineno">  201</span>                     [&amp;]() { <a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#aba411df8746d5fd4db2d28df3a016f5e">listen_worker</a>(local_port, child_sock_opts, &amp;serv); });</div>
<div class="line"><a id="l00202" name="l00202"></a><span class="lineno">  202</span>  <span class="comment">// If got here, the task has completed in thread W and signaled us to that effect.</span></div>
<div class="line"><a id="l00203" name="l00203"></a><span class="lineno">  203</span> </div>
<div class="line"><a id="l00204" name="l00204"></a><span class="lineno">  204</span>  <span class="comment">// listen_worker() indicates success or failure through this data member.</span></div>
<div class="line"><a id="l00205" name="l00205"></a><span class="lineno">  205</span>  <span class="keywordflow">if</span> (serv-&gt;m_disconnect_cause)</div>
<div class="line"><a id="l00206" name="l00206"></a><span class="lineno">  206</span>  {</div>
<div class="line"><a id="l00207" name="l00207"></a><span class="lineno">  207</span>    *err_code = serv-&gt;m_disconnect_cause;</div>
<div class="line"><a id="l00208" name="l00208"></a><span class="lineno">  208</span>    <span class="keywordflow">return</span> <a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Server_socket::Ptr</a>(); <span class="comment">// serv will go out of scope and thus will be destroyed.</span></div>
<div class="line"><a id="l00209" name="l00209"></a><span class="lineno">  209</span>  }</div>
<div class="line"><a id="l00210" name="l00210"></a><span class="lineno">  210</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l00211" name="l00211"></a><span class="lineno">  211</span>  err_code-&gt;clear();</div>
<div class="line"><a id="l00212" name="l00212"></a><span class="lineno">  212</span>  <span class="keywordflow">return</span> serv;</div>
<div class="line"><a id="l00213" name="l00213"></a><span class="lineno">  213</span>} <span class="comment">// Node::listen()</span></div>
<div class="line"><a id="l00214" name="l00214"></a><span class="lineno">  214</span> </div>
<div class="line"><a id="l00215" name="l00215"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Node.html#aba411df8746d5fd4db2d28df3a016f5e">  215</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#aba411df8746d5fd4db2d28df3a016f5e">Node::listen_worker</a>(<a class="code hl_typedef" href="namespaceflow_1_1net__flow.html#a079d8cd87a68d1c5f04c6bce71f0061d">flow_port_t</a> local_port, <span class="keyword">const</span> <a class="code hl_struct" href="structflow_1_1net__flow_1_1Peer__socket__options.html">Peer_socket_options</a>* child_sock_opts,</div>
<div class="line"><a id="l00216" name="l00216"></a><span class="lineno">  216</span>                         <a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Server_socket::Ptr</a>* serv_ptr)</div>
<div class="line"><a id="l00217" name="l00217"></a><span class="lineno">  217</span>{</div>
<div class="line"><a id="l00218" name="l00218"></a><span class="lineno">  218</span>  assert(serv_ptr);</div>
<div class="line"><a id="l00219" name="l00219"></a><span class="lineno">  219</span> </div>
<div class="line"><a id="l00220" name="l00220"></a><span class="lineno">  220</span>  <span class="comment">// We are in thread W.  listen() is waiting for us to set serv_promise in thread U.</span></div>
<div class="line"><a id="l00221" name="l00221"></a><span class="lineno">  221</span> </div>
<div class="line"><a id="l00222" name="l00222"></a><span class="lineno">  222</span>  <span class="comment">// Create new socket and set all members that may be immediately accessed by user from thread U after we&#39;re done.</span></div>
<div class="line"><a id="l00223" name="l00223"></a><span class="lineno">  223</span> </div>
<div class="line"><a id="l00224" name="l00224"></a><span class="lineno">  224</span>  <span class="keyword">auto</span>&amp; serv = *serv_ptr;</div>
<div class="line"><a id="l00225" name="l00225"></a><span class="lineno">  225</span>  <span class="keywordflow">if</span> (child_sock_opts)</div>
<div class="line"><a id="l00226" name="l00226"></a><span class="lineno">  226</span>  {</div>
<div class="line"><a id="l00227" name="l00227"></a><span class="lineno">  227</span>    <span class="comment">/* They provided custom per-socket options to distribute to any Peer_sockets created when people</span></div>
<div class="line"><a id="l00228" name="l00228"></a><span class="lineno">  228</span><span class="comment">     * connect to this server.  Before we give those to the new server socket, let&#39;s validate them</span></div>
<div class="line"><a id="l00229" name="l00229"></a><span class="lineno">  229</span><span class="comment">     * (for proper values and internal consistency, etc.). */</span></div>
<div class="line"><a id="l00230" name="l00230"></a><span class="lineno">  230</span> </div>
<div class="line"><a id="l00231" name="l00231"></a><span class="lineno">  231</span>    <a class="code hl_typedef" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09">Error_code</a> err_code;</div>
<div class="line"><a id="l00232" name="l00232"></a><span class="lineno">  232</span>    <span class="keyword">const</span> <span class="keywordtype">bool</span> opts_ok = <a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#a446ee7115c70cbcd48e3897d32fc0276">sock_validate_options</a>(*child_sock_opts, 0, &amp;err_code);</div>
<div class="line"><a id="l00233" name="l00233"></a><span class="lineno">  233</span> </div>
<div class="line"><a id="l00234" name="l00234"></a><span class="lineno">  234</span>    <span class="comment">// Due to the advertised interface of the current method, we must create a socket even on error.</span></div>
<div class="line"><a id="l00235" name="l00235"></a><span class="lineno">  235</span>    serv.reset(<a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#a0a91542fce634cf6a749c71f225b105a">serv_create</a>(child_sock_opts));</div>
<div class="line"><a id="l00236" name="l00236"></a><span class="lineno">  236</span> </div>
<div class="line"><a id="l00237" name="l00237"></a><span class="lineno">  237</span>    <span class="comment">// Now report error if indeed options were invalid.  err_code is already set and logged in that case.</span></div>
<div class="line"><a id="l00238" name="l00238"></a><span class="lineno">  238</span>    <span class="keywordflow">if</span> (!opts_ok)</div>
<div class="line"><a id="l00239" name="l00239"></a><span class="lineno">  239</span>    {</div>
<div class="line"><a id="l00240" name="l00240"></a><span class="lineno">  240</span>      serv-&gt;m_disconnect_cause = err_code;</div>
<div class="line"><a id="l00241" name="l00241"></a><span class="lineno">  241</span>      <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00242" name="l00242"></a><span class="lineno">  242</span>    }</div>
<div class="line"><a id="l00243" name="l00243"></a><span class="lineno">  243</span>    <span class="comment">// else</span></div>
<div class="line"><a id="l00244" name="l00244"></a><span class="lineno">  244</span>  }</div>
<div class="line"><a id="l00245" name="l00245"></a><span class="lineno">  245</span>  <span class="keywordflow">else</span></div>
<div class="line"><a id="l00246" name="l00246"></a><span class="lineno">  246</span>  {</div>
<div class="line"><a id="l00247" name="l00247"></a><span class="lineno">  247</span>    <span class="comment">/* More typically, they did not provide per-socket options.  So just pass null pointer into</span></div>
<div class="line"><a id="l00248" name="l00248"></a><span class="lineno">  248</span><span class="comment">     * Peer_socket constructor; this will mean that when a Peer_socket is generated on connection,</span></div>
<div class="line"><a id="l00249" name="l00249"></a><span class="lineno">  249</span><span class="comment">     * the code is to provide a copy of the global template for the per-socket options.  That will</span></div>
<div class="line"><a id="l00250" name="l00250"></a><span class="lineno">  250</span><span class="comment">     * happen later; we just pass in null. */</span></div>
<div class="line"><a id="l00251" name="l00251"></a><span class="lineno">  251</span>    serv.reset(<a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#a0a91542fce634cf6a749c71f225b105a">serv_create</a>(0));</div>
<div class="line"><a id="l00252" name="l00252"></a><span class="lineno">  252</span>  }</div>
<div class="line"><a id="l00253" name="l00253"></a><span class="lineno">  253</span> </div>
<div class="line"><a id="l00254" name="l00254"></a><span class="lineno">  254</span>  <span class="comment">// Server socket created; set members.</span></div>
<div class="line"><a id="l00255" name="l00255"></a><span class="lineno">  255</span> </div>
<div class="line"><a id="l00256" name="l00256"></a><span class="lineno">  256</span>  serv-&gt;m_node = <span class="keyword">this</span>;</div>
<div class="line"><a id="l00257" name="l00257"></a><span class="lineno">  257</span>  <a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#a0bac29a091e1026e5b4f0b5d84a710c7">serv_set_state</a>(serv, <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Server__socket.html#a8bc789b851677a47d7c0a1aa0c69a997aebae5ec546409cde4d74d99452d9cc8a">Server_socket::State::S_LISTENING</a>);</div>
<div class="line"><a id="l00258" name="l00258"></a><span class="lineno">  258</span> </div>
<div class="line"><a id="l00259" name="l00259"></a><span class="lineno">  259</span>  <span class="comment">// Allocate given port.</span></div>
<div class="line"><a id="l00260" name="l00260"></a><span class="lineno">  260</span>  serv-&gt;m_local_port = <a class="code hl_variable" href="classflow_1_1net__flow_1_1Node.html#afd6388a362531ada956a864fefff6011">m_ports</a>.<a class="code hl_function" href="classflow_1_1net__flow_1_1Port__space.html#a1168841ecd09d3187f9803eac2b8b703">reserve_port</a>(local_port, &amp;serv-&gt;m_disconnect_cause);</div>
<div class="line"><a id="l00261" name="l00261"></a><span class="lineno">  261</span>  <span class="keywordflow">if</span> (serv-&gt;m_local_port == <a class="code hl_variable" href="namespaceflow_1_1net__flow.html#a9dd0c9d8de00fab78d8b0a3f50dad2a9">S_PORT_ANY</a>)</div>
<div class="line"><a id="l00262" name="l00262"></a><span class="lineno">  262</span>  {</div>
<div class="line"><a id="l00263" name="l00263"></a><span class="lineno">  263</span>    <span class="comment">// Error already logged and is in serv-&gt;m_disconnect_cause.</span></div>
<div class="line"><a id="l00264" name="l00264"></a><span class="lineno">  264</span>    <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00265" name="l00265"></a><span class="lineno">  265</span>  }</div>
<div class="line"><a id="l00266" name="l00266"></a><span class="lineno">  266</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l00267" name="l00267"></a><span class="lineno">  267</span>  local_port = serv-&gt;m_local_port; <span class="comment">// If they&#39;d specified S_PORT_ANY, this is now a random port.</span></div>
<div class="line"><a id="l00268" name="l00268"></a><span class="lineno">  268</span> </div>
<div class="line"><a id="l00269" name="l00269"></a><span class="lineno">  269</span>  <a class="code hl_define" href="log_8hpp.html#a325fdd4b5cf0be49b37d3b7b7c29070d">FLOW_LOG_INFO</a>(<span class="stringliteral">&quot;NetFlow worker thread listening for passive-connects on [&quot;</span> &lt;&lt; serv &lt;&lt; <span class="stringliteral">&quot;].&quot;</span>);</div>
<div class="line"><a id="l00270" name="l00270"></a><span class="lineno">  270</span> </div>
<div class="line"><a id="l00271" name="l00271"></a><span class="lineno">  271</span>  <span class="keywordflow">if</span> (<a class="code hl_function" href="namespaceflow_1_1util.html#a03984e29450abf9cf287c501d6c8f866">util::key_exists</a>(<a class="code hl_variable" href="classflow_1_1net__flow_1_1Node.html#aae28990628a86a07327f49973f2390df">m_servs</a>, local_port))</div>
<div class="line"><a id="l00272" name="l00272"></a><span class="lineno">  272</span>  {</div>
<div class="line"><a id="l00273" name="l00273"></a><span class="lineno">  273</span>    <span class="comment">/* This is a passive connect (we&#39;re accepting future connections).  Therefore in particular it</span></div>
<div class="line"><a id="l00274" name="l00274"></a><span class="lineno">  274</span><span class="comment">     * should be impossible that our local_port() equals an already existing connection&#39;s</span></div>
<div class="line"><a id="l00275" name="l00275"></a><span class="lineno">  275</span><span class="comment">     * local_port(); Port_space is supposed to prevent the same port from being handed out to more</span></div>
<div class="line"><a id="l00276" name="l00276"></a><span class="lineno">  276</span><span class="comment">     * than one connection.  Therefore this must be a programming error. */</span></div>
<div class="line"><a id="l00277" name="l00277"></a><span class="lineno">  277</span> </div>
<div class="line"><a id="l00278" name="l00278"></a><span class="lineno">  278</span>    <a class="code hl_define" href="log_8hpp.html#a626c7dc4d3b4dc0b32a8aac8624d66bc">FLOW_LOG_WARNING</a>(<span class="stringliteral">&quot;Cannot set up [&quot;</span> &lt;&lt; serv &lt;&lt; <span class="stringliteral">&quot;], because server at port [&quot;</span> &lt;&lt; local_port &lt;&lt; <span class="stringliteral">&quot;] already exists!  &quot;</span></div>
<div class="line"><a id="l00279" name="l00279"></a><span class="lineno">  279</span>                     <span class="stringliteral">&quot;This is a port reservation error and constitutes either a bug or an extremely &quot;</span></div>
<div class="line"><a id="l00280" name="l00280"></a><span class="lineno">  280</span>                     <span class="stringliteral">&quot;unlikely condition.&quot;</span>);</div>
<div class="line"><a id="l00281" name="l00281"></a><span class="lineno">  281</span> </div>
<div class="line"><a id="l00282" name="l00282"></a><span class="lineno">  282</span>    <span class="comment">// Mark/log error.</span></div>
<div class="line"><a id="l00283" name="l00283"></a><span class="lineno">  283</span>    <a class="code hl_typedef" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09">Error_code</a>* err_code = &amp;serv-&gt;m_disconnect_cause;</div>
<div class="line"><a id="l00284" name="l00284"></a><span class="lineno">  284</span>    <a class="code hl_define" href="error_2error_8hpp.html#ab6b8ed79012c994cfc381e0b92c066fd">FLOW_ERROR_EMIT_ERROR</a>(<a class="code hl_enumvalue" href="namespaceflow_1_1net__flow_1_1error.html#a18e13de77b119ea0f2be411490859482ae90ff1c87f2393dd6b14232b159f02b2">error::Code::S_INTERNAL_ERROR_PORT_COLLISION</a>);</div>
<div class="line"><a id="l00285" name="l00285"></a><span class="lineno">  285</span> </div>
<div class="line"><a id="l00286" name="l00286"></a><span class="lineno">  286</span>    <span class="comment">// Return port.</span></div>
<div class="line"><a id="l00287" name="l00287"></a><span class="lineno">  287</span>    <a class="code hl_typedef" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09">Error_code</a> return_err_code;</div>
<div class="line"><a id="l00288" name="l00288"></a><span class="lineno">  288</span>    <a class="code hl_variable" href="classflow_1_1net__flow_1_1Node.html#afd6388a362531ada956a864fefff6011">m_ports</a>.<a class="code hl_function" href="classflow_1_1net__flow_1_1Port__space.html#a9fe1be917ff7584ff587b5da5967127a">return_port</a>(serv-&gt;m_local_port, &amp;return_err_code);</div>
<div class="line"><a id="l00289" name="l00289"></a><span class="lineno">  289</span>    assert(!return_err_code);</div>
<div class="line"><a id="l00290" name="l00290"></a><span class="lineno">  290</span>    <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00291" name="l00291"></a><span class="lineno">  291</span>  } <span class="comment">// if (that server entry already exists)</span></div>
<div class="line"><a id="l00292" name="l00292"></a><span class="lineno">  292</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l00293" name="l00293"></a><span class="lineno">  293</span> </div>
<div class="line"><a id="l00294" name="l00294"></a><span class="lineno">  294</span>  <a class="code hl_variable" href="classflow_1_1net__flow_1_1Node.html#aae28990628a86a07327f49973f2390df">m_servs</a>[local_port] = serv; <span class="comment">// Now SYNs will be accepted.</span></div>
<div class="line"><a id="l00295" name="l00295"></a><span class="lineno">  295</span>} <span class="comment">// Node::listen_worker()</span></div>
<div class="line"><a id="l00296" name="l00296"></a><span class="lineno">  296</span> </div>
<div class="line"><a id="l00297" name="l00297"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Node.html#ac3c67514c259404de3f27a8cae8b0567">  297</a></span><a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Peer_socket::Ptr</a> <a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#ac3c67514c259404de3f27a8cae8b0567">Node::accept</a>(<a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Server_socket::Ptr</a> serv, <a class="code hl_typedef" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09">Error_code</a>* err_code)</div>
<div class="line"><a id="l00298" name="l00298"></a><span class="lineno">  298</span>{</div>
<div class="line"><a id="l00299" name="l00299"></a><span class="lineno">  299</span>  <span class="comment">// We are in user thread U != W.</span></div>
<div class="line"><a id="l00300" name="l00300"></a><span class="lineno">  300</span> </div>
<div class="line"><a id="l00301" name="l00301"></a><span class="lineno">  301</span>  <span class="comment">// IMPORTANT: The logic here must be consistent with serv_is_acceptable().</span></div>
<div class="line"><a id="l00302" name="l00302"></a><span class="lineno">  302</span> </div>
<div class="line"><a id="l00303" name="l00303"></a><span class="lineno">  303</span>  <span class="comment">// serv-&gt;m_mutex already locked.</span></div>
<div class="line"><a id="l00304" name="l00304"></a><span class="lineno">  304</span> </div>
<div class="line"><a id="l00305" name="l00305"></a><span class="lineno">  305</span>  <span class="keywordflow">if</span> (serv-&gt;m_state == <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Server__socket.html#a8bc789b851677a47d7c0a1aa0c69a997aa27ca0689984ee6c6784a9265a678d42">Server_socket::State::S_CLOSING</a>)</div>
<div class="line"><a id="l00306" name="l00306"></a><span class="lineno">  306</span>  {</div>
<div class="line"><a id="l00307" name="l00307"></a><span class="lineno">  307</span>    <span class="comment">/* This is the same to the user as CLOSED -- only different in that serv has not been disowned by the Node yet.</span></div>
<div class="line"><a id="l00308" name="l00308"></a><span class="lineno">  308</span><span class="comment">     * See rationale for this in the accept() documentation header. */</span></div>
<div class="line"><a id="l00309" name="l00309"></a><span class="lineno">  309</span>    <a class="code hl_define" href="error_2error_8hpp.html#adc17094d4b9421abd04b90caab8b8e72">FLOW_ERROR_EMIT_ERROR_LOG_INFO</a>(serv-&gt;m_disconnect_cause);</div>
<div class="line"><a id="l00310" name="l00310"></a><span class="lineno">  310</span> </div>
<div class="line"><a id="l00311" name="l00311"></a><span class="lineno">  311</span>    <span class="comment">// Not listening anymore; pretend nothing on queue.</span></div>
<div class="line"><a id="l00312" name="l00312"></a><span class="lineno">  312</span>    <span class="keywordflow">return</span> <a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Peer_socket::Ptr</a>();</div>
<div class="line"><a id="l00313" name="l00313"></a><span class="lineno">  313</span>  }</div>
<div class="line"><a id="l00314" name="l00314"></a><span class="lineno">  314</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l00315" name="l00315"></a><span class="lineno">  315</span>  assert(serv-&gt;m_state == <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Server__socket.html#a8bc789b851677a47d7c0a1aa0c69a997aebae5ec546409cde4d74d99452d9cc8a">Server_socket::State::S_LISTENING</a>);</div>
<div class="line"><a id="l00316" name="l00316"></a><span class="lineno">  316</span> </div>
<div class="line"><a id="l00317" name="l00317"></a><span class="lineno">  317</span>  <span class="keywordflow">if</span> (serv-&gt;m_unaccepted_socks.empty())</div>
<div class="line"><a id="l00318" name="l00318"></a><span class="lineno">  318</span>  {</div>
<div class="line"><a id="l00319" name="l00319"></a><span class="lineno">  319</span>    <span class="comment">// Nothing on the queue.  As advertised, this is not an error in LISTENING state.</span></div>
<div class="line"><a id="l00320" name="l00320"></a><span class="lineno">  320</span>    err_code-&gt;clear();</div>
<div class="line"><a id="l00321" name="l00321"></a><span class="lineno">  321</span>    <span class="keywordflow">return</span> <a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Peer_socket::Ptr</a>();</div>
<div class="line"><a id="l00322" name="l00322"></a><span class="lineno">  322</span>  }</div>
<div class="line"><a id="l00323" name="l00323"></a><span class="lineno">  323</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l00324" name="l00324"></a><span class="lineno">  324</span> </div>
<div class="line"><a id="l00325" name="l00325"></a><span class="lineno">  325</span>  <span class="comment">// Pop from queue.  Linked_hash_set queues things up at the front (via insert()), so pop from the back.</span></div>
<div class="line"><a id="l00326" name="l00326"></a><span class="lineno">  326</span>  <a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Peer_socket::Ptr</a> sock = serv-&gt;m_unaccepted_socks.const_back();</div>
<div class="line"><a id="l00327" name="l00327"></a><span class="lineno">  327</span>  serv-&gt;m_unaccepted_socks.pop_back();</div>
<div class="line"><a id="l00328" name="l00328"></a><span class="lineno">  328</span> </div>
<div class="line"><a id="l00329" name="l00329"></a><span class="lineno">  329</span>  <span class="comment">/* Now that it&#39;s accepted, remove reference to the server socket, so that when the server socket</span></div>
<div class="line"><a id="l00330" name="l00330"></a><span class="lineno">  330</span><span class="comment">   * is closed, sock is not closed (since it&#39;s a fully functioning independent socket now). */</span></div>
<div class="line"><a id="l00331" name="l00331"></a><span class="lineno">  331</span>  sock-&gt;m_originating_serv.reset(); <span class="comment">// This is synchronized together with m_unaccepted_socks.</span></div>
<div class="line"><a id="l00332" name="l00332"></a><span class="lineno">  332</span> </div>
<div class="line"><a id="l00333" name="l00333"></a><span class="lineno">  333</span>  <a class="code hl_define" href="log_8hpp.html#a325fdd4b5cf0be49b37d3b7b7c29070d">FLOW_LOG_INFO</a>(<span class="stringliteral">&quot;Connection [&quot;</span> &lt;&lt; sock &lt;&lt; <span class="stringliteral">&quot;] on [&quot;</span> &lt;&lt; serv &lt;&lt; <span class="stringliteral">&quot;] accepted.&quot;</span>);</div>
<div class="line"><a id="l00334" name="l00334"></a><span class="lineno">  334</span> </div>
<div class="line"><a id="l00335" name="l00335"></a><span class="lineno">  335</span>  err_code-&gt;clear();</div>
<div class="line"><a id="l00336" name="l00336"></a><span class="lineno">  336</span>  <span class="keywordflow">return</span> sock;</div>
<div class="line"><a id="l00337" name="l00337"></a><span class="lineno">  337</span>} <span class="comment">// Node::accept()</span></div>
<div class="line"><a id="l00338" name="l00338"></a><span class="lineno">  338</span> </div>
<div class="line"><a id="l00339" name="l00339"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Node.html#a51b26bff4cdf545f22d8edec7185c5c4">  339</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#a51b26bff4cdf545f22d8edec7185c5c4">Node::serv_is_acceptable</a>(<span class="keyword">const</span> boost::any&amp; serv_as_any)<span class="keyword"> const</span></div>
<div class="line"><a id="l00340" name="l00340"></a><span class="lineno">  340</span><span class="keyword"></span>{</div>
<div class="line"><a id="l00341" name="l00341"></a><span class="lineno">  341</span>  <span class="keyword">using </span>boost::any_cast;</div>
<div class="line"><a id="l00342" name="l00342"></a><span class="lineno">  342</span> </div>
<div class="line"><a id="l00343" name="l00343"></a><span class="lineno">  343</span>  <span class="keyword">const</span> <a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aef7998db71c60eeb5d1e3d1a97c14886">Server_socket::Const_ptr</a> serv = any_cast&lt;Server_socket::Ptr&gt;(serv_as_any);</div>
<div class="line"><a id="l00344" name="l00344"></a><span class="lineno">  344</span> </div>
<div class="line"><a id="l00345" name="l00345"></a><span class="lineno">  345</span>  <a class="code hl_typedef" href="classflow_1_1net__flow_1_1Peer__socket.html#a90abde8badaf451ba6ca615e9936d5df">Peer_socket::Lock_guard</a> lock(serv-&gt;m_mutex); <span class="comment">// Many threads can access/write below state.</span></div>
<div class="line"><a id="l00346" name="l00346"></a><span class="lineno">  346</span> </div>
<div class="line"><a id="l00347" name="l00347"></a><span class="lineno">  347</span>  <span class="comment">/* Our task here is to return true if and only if at this very moment calling serv-&gt;accept()would</span></div>
<div class="line"><a id="l00348" name="l00348"></a><span class="lineno">  348</span><span class="comment">   * yield either a non-null return value OR a non-success *err_code.  In other words,</span></div>
<div class="line"><a id="l00349" name="l00349"></a><span class="lineno">  349</span><span class="comment">   * accept() would return &quot;something.&quot;  This is used for Event_set machinery.</span></div>
<div class="line"><a id="l00350" name="l00350"></a><span class="lineno">  350</span><span class="comment">   *</span></div>
<div class="line"><a id="l00351" name="l00351"></a><span class="lineno">  351</span><span class="comment">   * This should mirror accept()&#39;s algorithm.  @todo Should accept() call this, for code reuse?</span></div>
<div class="line"><a id="l00352" name="l00352"></a><span class="lineno">  352</span><span class="comment">   * Maybe/maybe not.  Consider performance when deciding.</span></div>
<div class="line"><a id="l00353" name="l00353"></a><span class="lineno">  353</span><span class="comment">   *</span></div>
<div class="line"><a id="l00354" name="l00354"></a><span class="lineno">  354</span><span class="comment">   * Basically, CLOSING/CLOSED =&gt; error (Acceptable); LISTENING + non-empty accept queue =&gt;</span></div>
<div class="line"><a id="l00355" name="l00355"></a><span class="lineno">  355</span><span class="comment">   * returns a socket (Acceptable); LISTENING + empty queue =&gt; returns null and no error (not</span></div>
<div class="line"><a id="l00356" name="l00356"></a><span class="lineno">  356</span><span class="comment">   * Acceptable).  So the latter is the only way (though quite common) it can be NOT Acceptable. */</span></div>
<div class="line"><a id="l00357" name="l00357"></a><span class="lineno">  357</span> </div>
<div class="line"><a id="l00358" name="l00358"></a><span class="lineno">  358</span>  <span class="keywordflow">return</span> !((serv-&gt;m_state == <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Server__socket.html#a8bc789b851677a47d7c0a1aa0c69a997aebae5ec546409cde4d74d99452d9cc8a">Server_socket::State::S_LISTENING</a>) &amp;&amp; serv-&gt;m_unaccepted_socks.empty());</div>
<div class="line"><a id="l00359" name="l00359"></a><span class="lineno">  359</span>} <span class="comment">// Node::serv_is_acceptable()</span></div>
<div class="line"><a id="l00360" name="l00360"></a><span class="lineno">  360</span> </div>
<div class="line"><a id="l00361" name="l00361"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Node.html#adf6d71af81def2d030f0fef159c1b06d">  361</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#adf6d71af81def2d030f0fef159c1b06d">Node::close_empty_server_immediately</a>(<span class="keyword">const</span> <a class="code hl_typedef" href="namespaceflow_1_1net__flow.html#a079d8cd87a68d1c5f04c6bce71f0061d">flow_port_t</a> local_port, <a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Server_socket::Ptr</a> serv,</div>
<div class="line"><a id="l00362" name="l00362"></a><span class="lineno">  362</span>                                          <span class="keyword">const</span> <a class="code hl_typedef" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09">Error_code</a>&amp; err_code, <span class="keywordtype">bool</span> defer_delta_check)</div>
<div class="line"><a id="l00363" name="l00363"></a><span class="lineno">  363</span>{</div>
<div class="line"><a id="l00364" name="l00364"></a><span class="lineno">  364</span>  <span class="comment">// We are in thread W.</span></div>
<div class="line"><a id="l00365" name="l00365"></a><span class="lineno">  365</span> </div>
<div class="line"><a id="l00366" name="l00366"></a><span class="lineno">  366</span>  <span class="comment">// Check explicitly documented pre-conditions.</span></div>
<div class="line"><a id="l00367" name="l00367"></a><span class="lineno">  367</span> </div>
<div class="line"><a id="l00368" name="l00368"></a><span class="lineno">  368</span>  assert(serv-&gt;m_state != <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Server__socket.html#a8bc789b851677a47d7c0a1aa0c69a997a6abcbd1be8478aa03e76aec9c540e14f">Server_socket::State::S_CLOSED</a>);</div>
<div class="line"><a id="l00369" name="l00369"></a><span class="lineno">  369</span>  <span class="comment">// Caller should have closed all the associated sockets already.</span></div>
<div class="line"><a id="l00370" name="l00370"></a><span class="lineno">  370</span>  assert(serv-&gt;m_connecting_socks.empty());</div>
<div class="line"><a id="l00371" name="l00371"></a><span class="lineno">  371</span>  {</div>
<div class="line"><a id="l00372" name="l00372"></a><span class="lineno">  372</span>    <a class="code hl_typedef" href="classflow_1_1net__flow_1_1Server__socket.html#ad428b65f60ee317aff7a0ad7f7a8f56d">Server_socket::Lock_guard</a> lock(serv-&gt;m_mutex); <span class="comment">// At least m_unaccepted_socks can be accessed by user.</span></div>
<div class="line"><a id="l00373" name="l00373"></a><span class="lineno">  373</span>    assert(serv-&gt;m_unaccepted_socks.empty());</div>
<div class="line"><a id="l00374" name="l00374"></a><span class="lineno">  374</span>  }</div>
<div class="line"><a id="l00375" name="l00375"></a><span class="lineno">  375</span> </div>
<div class="line"><a id="l00376" name="l00376"></a><span class="lineno">  376</span>  <a class="code hl_define" href="error_2error_8hpp.html#a5d44fa375b0080a95f45f664c0407c72">FLOW_ERROR_LOG_ERROR</a>(err_code);</div>
<div class="line"><a id="l00377" name="l00377"></a><span class="lineno">  377</span>  <a class="code hl_define" href="log_8hpp.html#a325fdd4b5cf0be49b37d3b7b7c29070d">FLOW_LOG_INFO</a>(<span class="stringliteral">&quot;Closing and destroying [&quot;</span> &lt;&lt; serv &lt;&lt; <span class="stringliteral">&quot;].&quot;</span>);</div>
<div class="line"><a id="l00378" name="l00378"></a><span class="lineno">  378</span> </div>
<div class="line"><a id="l00379" name="l00379"></a><span class="lineno">  379</span>  <a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#a2af9ec4f1483cd9a2183286f7dfa9c87">serv_close_detected</a>(serv, err_code, <span class="keyword">true</span>); <span class="comment">// Sets S_CLOSED public state (and related data).</span></div>
<div class="line"><a id="l00380" name="l00380"></a><span class="lineno">  380</span> </div>
<div class="line"><a id="l00381" name="l00381"></a><span class="lineno">  381</span>  <span class="comment">// Next, remove serv from our main server list.</span></div>
<div class="line"><a id="l00382" name="l00382"></a><span class="lineno">  382</span> </div>
<div class="line"><a id="l00383" name="l00383"></a><span class="lineno">  383</span><span class="preprocessor">#ifndef NDEBUG</span></div>
<div class="line"><a id="l00384" name="l00384"></a><span class="lineno">  384</span>  <span class="keyword">const</span> <span class="keywordtype">bool</span> erased = 1 ==</div>
<div class="line"><a id="l00385" name="l00385"></a><span class="lineno">  385</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l00386" name="l00386"></a><span class="lineno">  386</span>    <a class="code hl_variable" href="classflow_1_1net__flow_1_1Node.html#aae28990628a86a07327f49973f2390df">m_servs</a>.erase(local_port);</div>
<div class="line"><a id="l00387" name="l00387"></a><span class="lineno">  387</span>  assert(erased); <span class="comment">// Not S_CLOSED =&gt; it&#39;s in m_servs.  Otherwise there&#39;s a serious bug somewhere.</span></div>
<div class="line"><a id="l00388" name="l00388"></a><span class="lineno">  388</span> </div>
<div class="line"><a id="l00389" name="l00389"></a><span class="lineno">  389</span>  <span class="comment">// Return the port.</span></div>
<div class="line"><a id="l00390" name="l00390"></a><span class="lineno">  390</span>  <a class="code hl_typedef" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09">Error_code</a> return_err_code;</div>
<div class="line"><a id="l00391" name="l00391"></a><span class="lineno">  391</span>  <a class="code hl_variable" href="classflow_1_1net__flow_1_1Node.html#afd6388a362531ada956a864fefff6011">m_ports</a>.<a class="code hl_function" href="classflow_1_1net__flow_1_1Port__space.html#a9fe1be917ff7584ff587b5da5967127a">return_port</a>(local_port, &amp;return_err_code);</div>
<div class="line"><a id="l00392" name="l00392"></a><span class="lineno">  392</span>  assert(!return_err_code);</div>
<div class="line"><a id="l00393" name="l00393"></a><span class="lineno">  393</span> </div>
<div class="line"><a id="l00394" name="l00394"></a><span class="lineno">  394</span>  <span class="comment">/* serv has changed to CLOSED state.  Performing serv-&gt;accept() would therefore</span></div>
<div class="line"><a id="l00395" name="l00395"></a><span class="lineno">  395</span><span class="comment">   * certainly return an error.  Returning an error from that method (as opposed to null but no</span></div>
<div class="line"><a id="l00396" name="l00396"></a><span class="lineno">  396</span><span class="comment">   * error) is considered Acceptable (as we want to alert the user to the error, so her wait [if</span></div>
<div class="line"><a id="l00397" name="l00397"></a><span class="lineno">  397</span><span class="comment">   * any] wakes up and notices the error).  Therefore we should soon inform anyone waiting on any</span></div>
<div class="line"><a id="l00398" name="l00398"></a><span class="lineno">  398</span><span class="comment">   * Event_sets for serv to become Acceptable</span></div>
<div class="line"><a id="l00399" name="l00399"></a><span class="lineno">  399</span><span class="comment">   *</span></div>
<div class="line"><a id="l00400" name="l00400"></a><span class="lineno">  400</span><span class="comment">   * Caveat: Similar to that in Node::handle_syn_ack_ack_to_syn_rcvd() at similar point in the</span></div>
<div class="line"><a id="l00401" name="l00401"></a><span class="lineno">  401</span><span class="comment">   * code. */</span></div>
<div class="line"><a id="l00402" name="l00402"></a><span class="lineno">  402</span> </div>
<div class="line"><a id="l00403" name="l00403"></a><span class="lineno">  403</span>  <span class="comment">// Accumulate the event into the Node store (note: not any Event_set yet).</span></div>
<div class="line"><a id="l00404" name="l00404"></a><span class="lineno">  404</span>  <span class="keywordflow">if</span> (<a class="code hl_variable" href="classflow_1_1net__flow_1_1Node.html#ab0026feecdb74eda904d00d2c7016bab">m_sock_events</a>[<a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a19cc3a286c8a11c986d2a59ec1e39a71afb218b0110d3f9f26ee089bad2e0eba2">Event_set::Event_type::S_SERVER_SOCKET_ACCEPTABLE</a>].insert(serv).second)</div>
<div class="line"><a id="l00405" name="l00405"></a><span class="lineno">  405</span>  {</div>
<div class="line"><a id="l00406" name="l00406"></a><span class="lineno">  406</span>    <span class="comment">// Possibly inform the user for any applicable Event_sets right now.</span></div>
<div class="line"><a id="l00407" name="l00407"></a><span class="lineno">  407</span>    <a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#a8a4ddf81ddbeab1f740940c4cc0d3625">event_set_all_check_delta</a>(defer_delta_check);</div>
<div class="line"><a id="l00408" name="l00408"></a><span class="lineno">  408</span>  }</div>
<div class="line"><a id="l00409" name="l00409"></a><span class="lineno">  409</span>} <span class="comment">// Node::close_empty_server_immediately()</span></div>
<div class="line"><a id="l00410" name="l00410"></a><span class="lineno">  410</span> </div>
<div class="line"><a id="l00411" name="l00411"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Node.html#a0bac29a091e1026e5b4f0b5d84a710c7">  411</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#a0bac29a091e1026e5b4f0b5d84a710c7">Node::serv_set_state</a>(<a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Server_socket::Ptr</a> serv, <a class="code hl_enumeration" href="classflow_1_1net__flow_1_1Server__socket.html#a8bc789b851677a47d7c0a1aa0c69a997">Server_socket::State</a> state)</div>
<div class="line"><a id="l00412" name="l00412"></a><span class="lineno">  412</span>{</div>
<div class="line"><a id="l00413" name="l00413"></a><span class="lineno">  413</span>  <a class="code hl_typedef" href="classflow_1_1net__flow_1_1Server__socket.html#ad428b65f60ee317aff7a0ad7f7a8f56d">Server_socket::Lock_guard</a> lock(serv-&gt;m_mutex);</div>
<div class="line"><a id="l00414" name="l00414"></a><span class="lineno">  414</span> </div>
<div class="line"><a id="l00415" name="l00415"></a><span class="lineno">  415</span>  <span class="comment">// @todo Add TRACE logging.</span></div>
<div class="line"><a id="l00416" name="l00416"></a><span class="lineno">  416</span> </div>
<div class="line"><a id="l00417" name="l00417"></a><span class="lineno">  417</span>  serv-&gt;m_state = state;</div>
<div class="line"><a id="l00418" name="l00418"></a><span class="lineno">  418</span>  <span class="keywordflow">if</span> (state == <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Server__socket.html#a8bc789b851677a47d7c0a1aa0c69a997a6abcbd1be8478aa03e76aec9c540e14f">Server_socket::State::S_CLOSED</a>)</div>
<div class="line"><a id="l00419" name="l00419"></a><span class="lineno">  419</span>  {</div>
<div class="line"><a id="l00420" name="l00420"></a><span class="lineno">  420</span>    <span class="comment">/* Important convention: S_CLOSED means socket is permanently incapable of accepting more</span></div>
<div class="line"><a id="l00421" name="l00421"></a><span class="lineno">  421</span><span class="comment">     * connections.  At this point the originating Node removes the</span></div>
<div class="line"><a id="l00422" name="l00422"></a><span class="lineno">  422</span><span class="comment">     * socket from its internal structures.  Therefore, the Node itself may even go away -- while</span></div>
<div class="line"><a id="l00423" name="l00423"></a><span class="lineno">  423</span><span class="comment">     * this Server_socket still exists.  Since we use shared_ptr when giving our socket objects,</span></div>
<div class="line"><a id="l00424" name="l00424"></a><span class="lineno">  424</span><span class="comment">     * that&#39;s fine -- but we want to avoid returning an invalid Node* in node().  So, when</span></div>
<div class="line"><a id="l00425" name="l00425"></a><span class="lineno">  425</span><span class="comment">     * S_CLOSED, serv-&gt;m_node = 0. */</span></div>
<div class="line"><a id="l00426" name="l00426"></a><span class="lineno">  426</span>    serv-&gt;m_node = 0;</div>
<div class="line"><a id="l00427" name="l00427"></a><span class="lineno">  427</span>  }</div>
<div class="line"><a id="l00428" name="l00428"></a><span class="lineno">  428</span>}</div>
<div class="line"><a id="l00429" name="l00429"></a><span class="lineno">  429</span> </div>
<div class="line"><a id="l00430" name="l00430"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Node.html#aaaf5c3b5e6b9f9f1658b60907b36a498">  430</a></span><a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Peer_socket::Ptr</a> <a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#aaaf5c3b5e6b9f9f1658b60907b36a498">Node::handle_syn_to_listening_server</a>(<a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Server_socket::Ptr</a> serv,</div>
<div class="line"><a id="l00431" name="l00431"></a><span class="lineno">  431</span>                                                      boost::shared_ptr&lt;const Syn_packet&gt; syn,</div>
<div class="line"><a id="l00432" name="l00432"></a><span class="lineno">  432</span>                                                      <span class="keyword">const</span> <a class="code hl_typedef" href="namespaceflow_1_1util.html#af1b28edb7bad743c1c77f6b982cc3196">util::Udp_endpoint</a>&amp; low_lvl_remote_endpoint)</div>
<div class="line"><a id="l00433" name="l00433"></a><span class="lineno">  433</span>{</div>
<div class="line"><a id="l00434" name="l00434"></a><span class="lineno">  434</span>  <span class="keyword">using </span><a class="code hl_typedef" href="namespaceflow_1_1util.html#af09888b3a8feaff209b6625e493bc338">util::Blob</a>;</div>
<div class="line"><a id="l00435" name="l00435"></a><span class="lineno">  435</span>  <span class="keyword">using </span>boost::random::uniform_int_distribution;</div>
<div class="line"><a id="l00436" name="l00436"></a><span class="lineno">  436</span> </div>
<div class="line"><a id="l00437" name="l00437"></a><span class="lineno">  437</span>  <span class="comment">// We are in thread W.</span></div>
<div class="line"><a id="l00438" name="l00438"></a><span class="lineno">  438</span> </div>
<div class="line"><a id="l00439" name="l00439"></a><span class="lineno">  439</span>  <span class="comment">/* We just got SYN (an overture from the other side).  Create a peer-to-peer socket to track that</span></div>
<div class="line"><a id="l00440" name="l00440"></a><span class="lineno">  440</span><span class="comment">   * connection being established. */</span></div>
<div class="line"><a id="l00441" name="l00441"></a><span class="lineno">  441</span> </div>
<div class="line"><a id="l00442" name="l00442"></a><span class="lineno">  442</span>  <a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Peer_socket::Ptr</a> sock;</div>
<div class="line"><a id="l00443" name="l00443"></a><span class="lineno">  443</span>  <span class="keywordflow">if</span> (serv-&gt;m_child_sock_opts)</div>
<div class="line"><a id="l00444" name="l00444"></a><span class="lineno">  444</span>  {</div>
<div class="line"><a id="l00445" name="l00445"></a><span class="lineno">  445</span>    <span class="comment">/* They provided custom per-socket options in listen(), and we&#39;ve been storing them in *serv.</span></div>
<div class="line"><a id="l00446" name="l00446"></a><span class="lineno">  446</span><span class="comment">     * They&#39;re already validated at listen() time, so we just give them to Peer_socket constructor,</span></div>
<div class="line"><a id="l00447" name="l00447"></a><span class="lineno">  447</span><span class="comment">     * which copies them. */</span></div>
<div class="line"><a id="l00448" name="l00448"></a><span class="lineno">  448</span>    sock.reset(<a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#a6daaa6a5a7d0b7e5a2266dd9db400c01">sock_create</a>(*serv-&gt;m_child_sock_opts));</div>
<div class="line"><a id="l00449" name="l00449"></a><span class="lineno">  449</span>  }</div>
<div class="line"><a id="l00450" name="l00450"></a><span class="lineno">  450</span>  <span class="keywordflow">else</span></div>
<div class="line"><a id="l00451" name="l00451"></a><span class="lineno">  451</span>  {</div>
<div class="line"><a id="l00452" name="l00452"></a><span class="lineno">  452</span>    <span class="comment">/* More typically, they did not provide per-socket options.  So we just pass our global template</span></div>
<div class="line"><a id="l00453" name="l00453"></a><span class="lineno">  453</span><span class="comment">     * for the per-socket options to the Peer_socket constructor.  The only caveat is that template</span></div>
<div class="line"><a id="l00454" name="l00454"></a><span class="lineno">  454</span><span class="comment">     * may be concurrently changed, so we must lock it.  Could do it with opt(), but that introduces</span></div>
<div class="line"><a id="l00455" name="l00455"></a><span class="lineno">  455</span><span class="comment">     * an extra copy of the entire struct, so just do it explicitly (read-only lock for</span></div>
<div class="line"><a id="l00456" name="l00456"></a><span class="lineno">  456</span><span class="comment">     * performance).</span></div>
<div class="line"><a id="l00457" name="l00457"></a><span class="lineno">  457</span><span class="comment">     *</span></div>
<div class="line"><a id="l00458" name="l00458"></a><span class="lineno">  458</span><span class="comment">     * Note: no need to validate; global options (including per-socket ones) are validated</span></div>
<div class="line"><a id="l00459" name="l00459"></a><span class="lineno">  459</span><span class="comment">     * elsewhere when set. */</span></div>
<div class="line"><a id="l00460" name="l00460"></a><span class="lineno">  460</span>    <a class="code hl_typedef" href="classflow_1_1net__flow_1_1Node.html#a97c8679c70ac9c7dda394fdf335aaed7">Options_lock</a> lock(<a class="code hl_variable" href="classflow_1_1net__flow_1_1Node.html#a449ef757abee4c5d12f8fc62a5ca66b4">m_opts_mutex</a>);</div>
<div class="line"><a id="l00461" name="l00461"></a><span class="lineno">  461</span>    sock.reset(<a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#a6daaa6a5a7d0b7e5a2266dd9db400c01">sock_create</a>(<a class="code hl_variable" href="classflow_1_1net__flow_1_1Node.html#ade08f0457943f803c23b55649139c0d3">m_opts</a>.<a class="code hl_variable" href="structflow_1_1net__flow_1_1Node__options.html#a71b56a75a4b6dba57daeef79b0b880f7">m_dyn_sock_opts</a>));</div>
<div class="line"><a id="l00462" name="l00462"></a><span class="lineno">  462</span>  }</div>
<div class="line"><a id="l00463" name="l00463"></a><span class="lineno">  463</span> </div>
<div class="line"><a id="l00464" name="l00464"></a><span class="lineno">  464</span>  <span class="comment">// Socket created; set members.</span></div>
<div class="line"><a id="l00465" name="l00465"></a><span class="lineno">  465</span> </div>
<div class="line"><a id="l00466" name="l00466"></a><span class="lineno">  466</span>  sock-&gt;m_active_connect = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00467" name="l00467"></a><span class="lineno">  467</span>  sock-&gt;m_node = <span class="keyword">this</span>;</div>
<div class="line"><a id="l00468" name="l00468"></a><span class="lineno">  468</span>  <a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#ad502e0a992a79b71af42a9cdc20a4280">sock_set_state</a>(sock, <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Peer__socket.html#a6a9bb727c8982f24bcf978c10c2c7345a02dcbe46a8dfde95b9776744dacae189">Peer_socket::State::S_OPEN</a>, <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Peer__socket.html#a6f48d01d1269c9d4260d972baa40e548aae585d03fce4ac2011967830bf0ffbfb">Peer_socket::Open_sub_state::S_CONNECTING</a>);</div>
<div class="line"><a id="l00469" name="l00469"></a><span class="lineno">  469</span>  sock-&gt;m_remote_endpoint = <a class="code hl_struct" href="structflow_1_1net__flow_1_1Remote__endpoint.html">Remote_endpoint</a>{ low_lvl_remote_endpoint, syn-&gt;m_packed.m_src_port };</div>
<div class="line"><a id="l00470" name="l00470"></a><span class="lineno">  470</span>  sock-&gt;m_local_port = serv-&gt;m_local_port;</div>
<div class="line"><a id="l00471" name="l00471"></a><span class="lineno">  471</span>  <span class="comment">// Save it for user to be able to call sock-&gt;get_connect_metadata().  Add const to express we want copy, not move.</span></div>
<div class="line"><a id="l00472" name="l00472"></a><span class="lineno">  472</span>  sock-&gt;m_serialized_metadata = <span class="keyword">static_cast&lt;</span><span class="keyword">const </span><a class="code hl_typedef" href="namespaceflow_1_1util.html#af09888b3a8feaff209b6625e493bc338">Blob</a>&amp;<span class="keyword">&gt;</span>(syn-&gt;m_serialized_metadata);</div>
<div class="line"><a id="l00473" name="l00473"></a><span class="lineno">  473</span>  sock-&gt;m_int_state = <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Peer__socket.html#a9537860c2c2a7380a45a525e5121880fa6abcbd1be8478aa03e76aec9c540e14f">Peer_socket::Int_state::S_CLOSED</a>; <span class="comment">// Kind of pedantic.  We&#39;ll set SYN_RCVD a bit later on.</span></div>
<div class="line"><a id="l00474" name="l00474"></a><span class="lineno">  474</span>  <span class="comment">// Save the start of the sequence number series based on their initial sequence number.</span></div>
<div class="line"><a id="l00475" name="l00475"></a><span class="lineno">  475</span>  sock-&gt;m_rcv_init_seq_num = syn-&gt;m_init_seq_num;</div>
<div class="line"><a id="l00476" name="l00476"></a><span class="lineno">  476</span>  sock-&gt;m_rcv_next_seq_num = sock-&gt;m_rcv_init_seq_num + 1;</div>
<div class="line"><a id="l00477" name="l00477"></a><span class="lineno">  477</span> </div>
<div class="line"><a id="l00478" name="l00478"></a><span class="lineno">  478</span>  <span class="comment">/* Initialize the connection&#39;s send bandwidth estimator (object that estimates available</span></div>
<div class="line"><a id="l00479" name="l00479"></a><span class="lineno">  479</span><span class="comment">   * outgoing bandwidth based on incoming acknowledgments).  It may be used by m_snd_cong_ctl,</span></div>
<div class="line"><a id="l00480" name="l00480"></a><span class="lineno">  480</span><span class="comment">   * depending on the strategy chosen, but may be useful in its own right.  Hence it&#39;s a separate</span></div>
<div class="line"><a id="l00481" name="l00481"></a><span class="lineno">  481</span><span class="comment">   * object, not inside *m_snd_cong_ctl. */</span></div>
<div class="line"><a id="l00482" name="l00482"></a><span class="lineno">  482</span>  sock-&gt;m_snd_bandwidth_estimator.reset(<span class="keyword">new</span> <a class="code hl_class" href="classflow_1_1net__flow_1_1Send__bandwidth__estimator.html">Send_bandwidth_estimator</a>(<a class="code hl_function" href="classflow_1_1log_1_1Log__context.html#af4db395042b065b00398cd59845dcb4d">get_logger</a>(), sock));</div>
<div class="line"><a id="l00483" name="l00483"></a><span class="lineno">  483</span> </div>
<div class="line"><a id="l00484" name="l00484"></a><span class="lineno">  484</span>  <span class="comment">// Initialize the connection&#39;s congestion control strategy based on the configured strategy.</span></div>
<div class="line"><a id="l00485" name="l00485"></a><span class="lineno">  485</span>  sock-&gt;m_snd_cong_ctl.reset</div>
<div class="line"><a id="l00486" name="l00486"></a><span class="lineno">  486</span>    (<a class="code hl_function" href="classflow_1_1net__flow_1_1Congestion__control__selector.html#a52eee18d41c3f9cc7d6c48b766a7919f">Congestion_control_selector::create_strategy</a>(sock-&gt;m_opts.m_st_cong_ctl_strategy, <a class="code hl_function" href="classflow_1_1log_1_1Log__context.html#af4db395042b065b00398cd59845dcb4d">get_logger</a>(), sock));</div>
<div class="line"><a id="l00487" name="l00487"></a><span class="lineno">  487</span>  <span class="comment">// ^-- No need to use opt() yet: user doesn&#39;t have socket and cannot set_options() on it yet.</span></div>
<div class="line"><a id="l00488" name="l00488"></a><span class="lineno">  488</span> </div>
<div class="line"><a id="l00489" name="l00489"></a><span class="lineno">  489</span>  <span class="keyword">const</span> <a class="code hl_struct" href="structflow_1_1net__flow_1_1Node_1_1Socket__id.html">Socket_id</a>&amp; <a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#a99836ffb51eaefa4d2cc21770461cd97">socket_id</a> = <a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#a99836ffb51eaefa4d2cc21770461cd97">Node::socket_id</a>(sock);</div>
<div class="line"><a id="l00490" name="l00490"></a><span class="lineno">  490</span>  <a class="code hl_define" href="log_8hpp.html#a325fdd4b5cf0be49b37d3b7b7c29070d">FLOW_LOG_INFO</a>(<span class="stringliteral">&quot;NetFlow worker thread starting passive-connect of [&quot;</span> &lt;&lt; sock &lt;&lt; <span class="stringliteral">&quot;] on [&quot;</span> &lt;&lt; serv &lt;&lt; <span class="stringliteral">&quot;].  &quot;</span></div>
<div class="line"><a id="l00491" name="l00491"></a><span class="lineno">  491</span>                <span class="stringliteral">&quot;Received [&quot;</span> &lt;&lt; syn-&gt;m_type_ostream_manip &lt;&lt; <span class="stringliteral">&quot;] with ISN [&quot;</span> &lt;&lt; syn-&gt;m_init_seq_num &lt;&lt; <span class="stringliteral">&quot;].&quot;</span>);</div>
<div class="line"><a id="l00492" name="l00492"></a><span class="lineno">  492</span> </div>
<div class="line"><a id="l00493" name="l00493"></a><span class="lineno">  493</span>  <span class="comment">// Ensure we can support the specified packet options.</span></div>
<div class="line"><a id="l00494" name="l00494"></a><span class="lineno">  494</span> </div>
<div class="line"><a id="l00495" name="l00495"></a><span class="lineno">  495</span>  <span class="keywordflow">if</span> (syn-&gt;m_opt_rexmit_on != sock-&gt;rexmit_on())</div>
<div class="line"><a id="l00496" name="l00496"></a><span class="lineno">  496</span>  {</div>
<div class="line"><a id="l00497" name="l00497"></a><span class="lineno">  497</span>    <a class="code hl_define" href="log_8hpp.html#a626c7dc4d3b4dc0b32a8aac8624d66bc">FLOW_LOG_WARNING</a>(<span class="stringliteral">&quot;NetFlow worker thread starting passive-connect of [&quot;</span> &lt;&lt; sock &lt;&lt; <span class="stringliteral">&quot;] on [&quot;</span> &lt;&lt; serv &lt;&lt; <span class="stringliteral">&quot;].  &quot;</span></div>
<div class="line"><a id="l00498" name="l00498"></a><span class="lineno">  498</span>                     <span class="stringliteral">&quot;Received [&quot;</span> &lt;&lt; syn-&gt;m_type_ostream_manip &lt;&lt; <span class="stringliteral">&quot;] with &quot;</span></div>
<div class="line"><a id="l00499" name="l00499"></a><span class="lineno">  499</span>                     <span class="stringliteral">&quot;opt_rexmit_on [&quot;</span> &lt;&lt; syn-&gt;m_opt_rexmit_on &lt;&lt; <span class="stringliteral">&quot;]; was configured otherwise on this side; &quot;</span></div>
<div class="line"><a id="l00500" name="l00500"></a><span class="lineno">  500</span>                     <span class="stringliteral">&quot;resetting connection.&quot;</span>);</div>
<div class="line"><a id="l00501" name="l00501"></a><span class="lineno">  501</span>    <span class="comment">/* We&#39;d inform the user here, but they didn&#39;t open the connection (it&#39;s a passive open, and they</span></div>
<div class="line"><a id="l00502" name="l00502"></a><span class="lineno">  502</span><span class="comment">     * haven&#39;t yet called accept()).  We can respond with RST, however, to tell the other side this</span></div>
<div class="line"><a id="l00503" name="l00503"></a><span class="lineno">  503</span><span class="comment">     * connection isn&#39;t going to happen.  We didn&#39;t place sock into m_socks, so just let it</span></div>
<div class="line"><a id="l00504" name="l00504"></a><span class="lineno">  504</span><span class="comment">     * disappear via shared_ptr&lt;&gt; magic. */</span></div>
<div class="line"><a id="l00505" name="l00505"></a><span class="lineno">  505</span>    <a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#a74a6a82a1390a76e985593969fb47184">async_no_sock_low_lvl_rst_send</a>(<a class="code hl_function" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#a520b351b1463e585e278c8c7241b8fc8">Low_lvl_packet::const_ptr_cast</a>(syn), low_lvl_remote_endpoint);</div>
<div class="line"><a id="l00506" name="l00506"></a><span class="lineno">  506</span>    <span class="keywordflow">return</span> <a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Peer_socket::Ptr</a>();</div>
<div class="line"><a id="l00507" name="l00507"></a><span class="lineno">  507</span>  }</div>
<div class="line"><a id="l00508" name="l00508"></a><span class="lineno">  508</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l00509" name="l00509"></a><span class="lineno">  509</span> </div>
<div class="line"><a id="l00510" name="l00510"></a><span class="lineno">  510</span>  <span class="comment">// Ensure this socket pair does not yet exist in our peer-to-peer socket table.</span></div>
<div class="line"><a id="l00511" name="l00511"></a><span class="lineno">  511</span> </div>
<div class="line"><a id="l00512" name="l00512"></a><span class="lineno">  512</span>  <span class="keywordflow">if</span> (<a class="code hl_function" href="namespaceflow_1_1util.html#a03984e29450abf9cf287c501d6c8f866">util::key_exists</a>(<a class="code hl_variable" href="classflow_1_1net__flow_1_1Node.html#a90244d69d550370158bbe843ab595a7a">m_socks</a>, <a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#a99836ffb51eaefa4d2cc21770461cd97">socket_id</a>))</div>
<div class="line"><a id="l00513" name="l00513"></a><span class="lineno">  513</span>  {</div>
<div class="line"><a id="l00514" name="l00514"></a><span class="lineno">  514</span>    <span class="comment">/* This is a passive connect (they&#39;re intiating the connection).  Therefore in particular it</span></div>
<div class="line"><a id="l00515" name="l00515"></a><span class="lineno">  515</span><span class="comment">     * should be impossible that our local_port() equals an already existing connection&#39;s</span></div>
<div class="line"><a id="l00516" name="l00516"></a><span class="lineno">  516</span><span class="comment">     * local_port(); Port_space is supposed to prevent the same ephemeral or service port from being</span></div>
<div class="line"><a id="l00517" name="l00517"></a><span class="lineno">  517</span><span class="comment">     * handed out to more than one connection.  Therefore this must be a programming error. */</span></div>
<div class="line"><a id="l00518" name="l00518"></a><span class="lineno">  518</span> </div>
<div class="line"><a id="l00519" name="l00519"></a><span class="lineno">  519</span>    <a class="code hl_define" href="log_8hpp.html#a626c7dc4d3b4dc0b32a8aac8624d66bc">FLOW_LOG_WARNING</a>(<span class="stringliteral">&quot;Cannot add [&quot;</span> &lt;&lt; sock &lt;&lt; <span class="stringliteral">&quot;], because such a connection already exists.  &quot;</span></div>
<div class="line"><a id="l00520" name="l00520"></a><span class="lineno">  520</span>                     <span class="stringliteral">&quot;This is an ephemeral or service port collision and &quot;</span></div>
<div class="line"><a id="l00521" name="l00521"></a><span class="lineno">  521</span>                     <span class="stringliteral">&quot;constitutes either a bug or an extremely unlikely condition.&quot;</span>);</div>
<div class="line"><a id="l00522" name="l00522"></a><span class="lineno">  522</span> </div>
<div class="line"><a id="l00523" name="l00523"></a><span class="lineno">  523</span>    <span class="comment">// Same reasoning as above: send RST, and let sock disappear.</span></div>
<div class="line"><a id="l00524" name="l00524"></a><span class="lineno">  524</span>    <a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#a74a6a82a1390a76e985593969fb47184">async_no_sock_low_lvl_rst_send</a>(syn, low_lvl_remote_endpoint);</div>
<div class="line"><a id="l00525" name="l00525"></a><span class="lineno">  525</span>    <span class="keywordflow">return</span> <a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Peer_socket::Ptr</a>();</div>
<div class="line"><a id="l00526" name="l00526"></a><span class="lineno">  526</span>  } <span class="comment">// if (that socket pair already exists)</span></div>
<div class="line"><a id="l00527" name="l00527"></a><span class="lineno">  527</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l00528" name="l00528"></a><span class="lineno">  528</span> </div>
<div class="line"><a id="l00529" name="l00529"></a><span class="lineno">  529</span>  <span class="comment">/* Try the packet send (as just below) again if SYN_ACK not acknowledged within a certain amount of</span></div>
<div class="line"><a id="l00530" name="l00530"></a><span class="lineno">  530</span><span class="comment">   * time.  Give up if that happens too many times.</span></div>
<div class="line"><a id="l00531" name="l00531"></a><span class="lineno">  531</span><span class="comment">   * Follow same order of ops (schedule, send) as in the SYN case elsewhere. */</span></div>
<div class="line"><a id="l00532" name="l00532"></a><span class="lineno">  532</span>  <a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#ac1485c07049d4bee70ad4ef2fc07bf12">setup_connection_timers</a>(<a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#a99836ffb51eaefa4d2cc21770461cd97">socket_id</a>, sock, <span class="keyword">true</span>);</div>
<div class="line"><a id="l00533" name="l00533"></a><span class="lineno">  533</span> </div>
<div class="line"><a id="l00534" name="l00534"></a><span class="lineno">  534</span>  <span class="comment">// Send SYN_ACK to continue the handshake.  Save some *sock data first, as they are used in create_syn_ack().</span></div>
<div class="line"><a id="l00535" name="l00535"></a><span class="lineno">  535</span> </div>
<div class="line"><a id="l00536" name="l00536"></a><span class="lineno">  536</span>  <span class="comment">/* Initial Sequence Number (the start of our own series).</span></div>
<div class="line"><a id="l00537" name="l00537"></a><span class="lineno">  537</span><span class="comment">   * Remember it in case we must retransmit the SYN.  (m_snd_next_seq_num may have been further increased by then.) */</span></div>
<div class="line"><a id="l00538" name="l00538"></a><span class="lineno">  538</span>  <a class="code hl_class" href="classflow_1_1net__flow_1_1Sequence__number.html">Sequence_number</a>&amp; init_seq_num = sock-&gt;m_snd_init_seq_num;</div>
<div class="line"><a id="l00539" name="l00539"></a><span class="lineno">  539</span>  init_seq_num = <a class="code hl_variable" href="classflow_1_1net__flow_1_1Node.html#a8938c4a091edf1c1c77e2cc8f505f0ff">m_seq_num_generator</a>.<a class="code hl_function" href="classflow_1_1net__flow_1_1Sequence__number_1_1Generator.html#a06f094532f4be6ab3b69d27ea39b2d4d">generate_init_seq_num</a>();</div>
<div class="line"><a id="l00540" name="l00540"></a><span class="lineno">  540</span>  <span class="comment">// Same comment as when calling sock-&gt;m_snd_init_seq_num.set_metadata() elsewhere.  See that.</span></div>
<div class="line"><a id="l00541" name="l00541"></a><span class="lineno">  541</span>  init_seq_num.<a class="code hl_function" href="classflow_1_1net__flow_1_1Sequence__number.html#a77ce8cf348e93caa8bb03f22f7b7d120">set_metadata</a>(<span class="charliteral">&#39;L&#39;</span>,init_seq_num + 1, sock-&gt;max_block_size());</div>
<div class="line"><a id="l00542" name="l00542"></a><span class="lineno">  542</span>  <span class="comment">// Sequence number of first bit of actual data.</span></div>
<div class="line"><a id="l00543" name="l00543"></a><span class="lineno">  543</span>  sock-&gt;m_snd_next_seq_num = init_seq_num + 1;</div>
<div class="line"><a id="l00544" name="l00544"></a><span class="lineno">  544</span>  <span class="comment">// Security token.  Random number from entire numeric range.  Remember it for later verification.</span></div>
<div class="line"><a id="l00545" name="l00545"></a><span class="lineno">  545</span>  sock-&gt;m_security_token = <a class="code hl_variable" href="classflow_1_1net__flow_1_1Node.html#ae536f016607677a945ad42034a21e82a">m_rnd_security_tokens</a>();</div>
<div class="line"><a id="l00546" name="l00546"></a><span class="lineno">  546</span>  <span class="comment">// Initial receive window is simply the entire empty Receive buffer.</span></div>
<div class="line"><a id="l00547" name="l00547"></a><span class="lineno">  547</span>  sock-&gt;m_rcv_last_sent_rcv_wnd = <a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#ac397d3fd163f1456b7bb370a3cff951c">sock_rcv_wnd</a>(sock);</div>
<div class="line"><a id="l00548" name="l00548"></a><span class="lineno">  548</span> </div>
<div class="line"><a id="l00549" name="l00549"></a><span class="lineno">  549</span>  <span class="comment">// Make a packet; fill out common fields in and asynchronously send it.</span></div>
<div class="line"><a id="l00550" name="l00550"></a><span class="lineno">  550</span>  <span class="keyword">auto</span> syn_ack = <a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#a6bcd840049c57150cdaa5c59d22c488b">create_syn_ack</a>(sock);</div>
<div class="line"><a id="l00551" name="l00551"></a><span class="lineno">  551</span>  <a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#af1c4623729d0a061200a386f7a651926">async_sock_low_lvl_packet_send_paced</a>(sock, <a class="code hl_function" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#a55a247bb8fb2ec94b7cbfdd56be65a81">Low_lvl_packet::ptr_cast</a>(syn_ack));</div>
<div class="line"><a id="l00552" name="l00552"></a><span class="lineno">  552</span> </div>
<div class="line"><a id="l00553" name="l00553"></a><span class="lineno">  553</span>  <span class="comment">/* send will happen asynchronously, and the registered completion handler will execute in this</span></div>
<div class="line"><a id="l00554" name="l00554"></a><span class="lineno">  554</span><span class="comment">   * thread when done (NO SOONER than this method finishes executing). */</span></div>
<div class="line"><a id="l00555" name="l00555"></a><span class="lineno">  555</span> </div>
<div class="line"><a id="l00556" name="l00556"></a><span class="lineno">  556</span>  <span class="comment">// No more errors: Map socket pair to the socket data structure (kind of analogous to a TCP net-stack&#39;s TCB).</span></div>
<div class="line"><a id="l00557" name="l00557"></a><span class="lineno">  557</span>  <a class="code hl_variable" href="classflow_1_1net__flow_1_1Node.html#a90244d69d550370158bbe843ab595a7a">m_socks</a>[<a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#a99836ffb51eaefa4d2cc21770461cd97">socket_id</a>] = sock;</div>
<div class="line"><a id="l00558" name="l00558"></a><span class="lineno">  558</span> </div>
<div class="line"><a id="l00559" name="l00559"></a><span class="lineno">  559</span>  <span class="comment">// Also record it within the server socket (more comments inside this method).</span></div>
<div class="line"><a id="l00560" name="l00560"></a><span class="lineno">  560</span>  <a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#a0379c897bdb3e4eddeb759547be78261">serv_peer_socket_init</a>(serv, sock);</div>
<div class="line"><a id="l00561" name="l00561"></a><span class="lineno">  561</span> </div>
<div class="line"><a id="l00562" name="l00562"></a><span class="lineno">  562</span>  <span class="comment">// CLOSED -&gt; SYN_RCVD.</span></div>
<div class="line"><a id="l00563" name="l00563"></a><span class="lineno">  563</span>  <a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#aa1d9656e9e1480021c87530ec6dbebbe">sock_set_int_state</a>(sock, <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Peer__socket.html#a9537860c2c2a7380a45a525e5121880fa9838c717b26793d3b5360e4d718dc2d2">Peer_socket::Int_state::S_SYN_RCVD</a>);</div>
<div class="line"><a id="l00564" name="l00564"></a><span class="lineno">  564</span> </div>
<div class="line"><a id="l00565" name="l00565"></a><span class="lineno">  565</span>  <span class="keywordflow">return</span> sock;</div>
<div class="line"><a id="l00566" name="l00566"></a><span class="lineno">  566</span>} <span class="comment">// Node::handle_syn_to_listening_server()</span></div>
<div class="line"><a id="l00567" name="l00567"></a><span class="lineno">  567</span> </div>
<div class="line"><a id="l00568" name="l00568"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Node.html#a29d02f9e302c7b06288ff1c644fa8d65">  568</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#a29d02f9e302c7b06288ff1c644fa8d65">Node::handle_syn_ack_ack_to_syn_rcvd</a>(<span class="keyword">const</span> <a class="code hl_struct" href="structflow_1_1net__flow_1_1Node_1_1Socket__id.html">Socket_id</a>&amp; socket_id,</div>
<div class="line"><a id="l00569" name="l00569"></a><span class="lineno">  569</span>                                          <a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Peer_socket::Ptr</a> sock,</div>
<div class="line"><a id="l00570" name="l00570"></a><span class="lineno">  570</span>                                          boost::shared_ptr&lt;const Syn_ack_ack_packet&gt; syn_ack_ack)</div>
<div class="line"><a id="l00571" name="l00571"></a><span class="lineno">  571</span>{</div>
<div class="line"><a id="l00572" name="l00572"></a><span class="lineno">  572</span>  <span class="keyword">using </span>boost::shared_ptr;</div>
<div class="line"><a id="l00573" name="l00573"></a><span class="lineno">  573</span> </div>
<div class="line"><a id="l00574" name="l00574"></a><span class="lineno">  574</span>  <span class="comment">// We are in thread W.</span></div>
<div class="line"><a id="l00575" name="l00575"></a><span class="lineno">  575</span> </div>
<div class="line"><a id="l00576" name="l00576"></a><span class="lineno">  576</span>  <span class="comment">/* We&#39;d sent SYN_ACK and just got SYN_ACK_ACK.  Assuming their SYN_ACK_ACK is valid, our side of</span></div>
<div class="line"><a id="l00577" name="l00577"></a><span class="lineno">  577</span><span class="comment">   * connection can move to ESTABLISHED state, as theirs already has. */</span></div>
<div class="line"><a id="l00578" name="l00578"></a><span class="lineno">  578</span> </div>
<div class="line"><a id="l00579" name="l00579"></a><span class="lineno">  579</span>  <a class="code hl_define" href="log_8hpp.html#a325fdd4b5cf0be49b37d3b7b7c29070d">FLOW_LOG_INFO</a>(<span class="stringliteral">&quot;NetFlow worker thread continuing passive-connect of socket [&quot;</span> &lt;&lt; sock &lt;&lt; <span class="stringliteral">&quot;].  &quot;</span></div>
<div class="line"><a id="l00580" name="l00580"></a><span class="lineno">  580</span>                <span class="stringliteral">&quot;Received [&quot;</span> &lt;&lt; syn_ack_ack-&gt;m_type_ostream_manip &lt;&lt; <span class="stringliteral">&quot;]; &quot;</span></div>
<div class="line"><a id="l00581" name="l00581"></a><span class="lineno">  581</span>                <span class="stringliteral">&quot;security token [&quot;</span> &lt;&lt; syn_ack_ack-&gt;m_packed.m_security_token &lt;&lt; <span class="stringliteral">&quot;].&quot;</span>);</div>
<div class="line"><a id="l00582" name="l00582"></a><span class="lineno">  582</span> </div>
<div class="line"><a id="l00583" name="l00583"></a><span class="lineno">  583</span>  <span class="comment">// First, validate their security token equals the one we&#39;ve sent.</span></div>
<div class="line"><a id="l00584" name="l00584"></a><span class="lineno">  584</span>  <span class="keywordflow">if</span> (sock-&gt;m_security_token != syn_ack_ack-&gt;m_packed.m_security_token)</div>
<div class="line"><a id="l00585" name="l00585"></a><span class="lineno">  585</span>  {</div>
<div class="line"><a id="l00586" name="l00586"></a><span class="lineno">  586</span>    <a class="code hl_define" href="log_8hpp.html#a626c7dc4d3b4dc0b32a8aac8624d66bc">FLOW_LOG_WARNING</a>(<span class="stringliteral">&quot;Received [&quot;</span> &lt;&lt; syn_ack_ack-&gt;m_type_ostream_manip &lt;&lt; <span class="stringliteral">&quot;] targeted at state &quot;</span></div>
<div class="line"><a id="l00587" name="l00587"></a><span class="lineno">  587</span>                     <span class="stringliteral">&quot;[&quot;</span> &lt;&lt; <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Peer__socket.html#a9537860c2c2a7380a45a525e5121880fa9838c717b26793d3b5360e4d718dc2d2">Peer_socket::Int_state::S_SYN_RCVD</a> &lt;&lt; <span class="stringliteral">&quot;] socket [&quot;</span> &lt;&lt; sock &lt;&lt; <span class="stringliteral">&quot;] &quot;</span></div>
<div class="line"><a id="l00588" name="l00588"></a><span class="lineno">  588</span>                     <span class="stringliteral">&quot;with mismatching security token &quot;</span></div>
<div class="line"><a id="l00589" name="l00589"></a><span class="lineno">  589</span>                     <span class="stringliteral">&quot;[&quot;</span> &lt;&lt; syn_ack_ack-&gt;m_packed.m_security_token &lt;&lt; <span class="stringliteral">&quot;]; we had received and sent and expect &quot;</span></div>
<div class="line"><a id="l00590" name="l00590"></a><span class="lineno">  590</span>                     <span class="stringliteral">&quot;[&quot;</span> &lt;&lt; sock-&gt;m_security_token &lt;&lt; <span class="stringliteral">&quot;].  Closing.&quot;</span>);</div>
<div class="line"><a id="l00591" name="l00591"></a><span class="lineno">  591</span>    <span class="comment">/* Close connection in our structures (inform user if necessary as well).  Pre-conditions</span></div>
<div class="line"><a id="l00592" name="l00592"></a><span class="lineno">  592</span><span class="comment">     * assumed by call: sock in m_socks and sock-&gt;state() == S_OPEN (yes, since m_int_state ==</span></div>
<div class="line"><a id="l00593" name="l00593"></a><span class="lineno">  593</span><span class="comment">     * S_SYN_RCVD); 3rd arg contains the reason for the close (yes). */</span></div>
<div class="line"><a id="l00594" name="l00594"></a><span class="lineno">  594</span>    <a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#afe70a0c32695e417e7a09e0ba773f151">rst_and_close_connection_immediately</a>(<a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#a99836ffb51eaefa4d2cc21770461cd97">socket_id</a>, sock, <a class="code hl_enumvalue" href="namespaceflow_1_1net__flow_1_1error.html#a18e13de77b119ea0f2be411490859482ab2c97d0fbc585d3726ec79c7802da891">error::Code::S_CONN_RESET_BAD_PEER_BEHAVIOR</a>, <span class="keyword">true</span>);</div>
<div class="line"><a id="l00595" name="l00595"></a><span class="lineno">  595</span>    <span class="comment">// ^-- defer_delta_check == true: for similar reason as at the end of this method.</span></div>
<div class="line"><a id="l00596" name="l00596"></a><span class="lineno">  596</span>    <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00597" name="l00597"></a><span class="lineno">  597</span>  }</div>
<div class="line"><a id="l00598" name="l00598"></a><span class="lineno">  598</span>  <span class="comment">// else OK.</span></div>
<div class="line"><a id="l00599" name="l00599"></a><span class="lineno">  599</span> </div>
<div class="line"><a id="l00600" name="l00600"></a><span class="lineno">  600</span>  <span class="comment">// No more errors.</span></div>
<div class="line"><a id="l00601" name="l00601"></a><span class="lineno">  601</span> </div>
<div class="line"><a id="l00602" name="l00602"></a><span class="lineno">  602</span>  <span class="comment">// Move ourselves to connected state.</span></div>
<div class="line"><a id="l00603" name="l00603"></a><span class="lineno">  603</span> </div>
<div class="line"><a id="l00604" name="l00604"></a><span class="lineno">  604</span>  <span class="comment">// The server socket to which the other side sent SYN to create the peer socket sock.</span></div>
<div class="line"><a id="l00605" name="l00605"></a><span class="lineno">  605</span>  <span class="keyword">const</span> <a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Server_socket::Ptr</a> serv = sock-&gt;m_originating_serv;</div>
<div class="line"><a id="l00606" name="l00606"></a><span class="lineno">  606</span> </div>
<div class="line"><a id="l00607" name="l00607"></a><span class="lineno">  607</span>  <span class="comment">// Public state (thread-safe).</span></div>
<div class="line"><a id="l00608" name="l00608"></a><span class="lineno">  608</span>  <a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#ad502e0a992a79b71af42a9cdc20a4280">sock_set_state</a>(sock, <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Peer__socket.html#a6a9bb727c8982f24bcf978c10c2c7345a02dcbe46a8dfde95b9776744dacae189">Peer_socket::State::S_OPEN</a>, <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Peer__socket.html#a6f48d01d1269c9d4260d972baa40e548a357459237df4b1f8f34e81ce43e2d8fe">Peer_socket::Open_sub_state::S_CONNECTED</a>);</div>
<div class="line"><a id="l00609" name="l00609"></a><span class="lineno">  609</span>  <span class="comment">// Internal state.  SYN_RCVD -&gt; ESTABLISHED.</span></div>
<div class="line"><a id="l00610" name="l00610"></a><span class="lineno">  610</span>  <a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#aa1d9656e9e1480021c87530ec6dbebbe">sock_set_int_state</a>(sock, <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Peer__socket.html#a9537860c2c2a7380a45a525e5121880fa16fdfce85d7bca9386378acd29eb7202">Peer_socket::Int_state::S_ESTABLISHED</a>);</div>
<div class="line"><a id="l00611" name="l00611"></a><span class="lineno">  611</span> </div>
<div class="line"><a id="l00612" name="l00612"></a><span class="lineno">  612</span>  <span class="comment">// Got the acknowledgment to SYN_ACK, so cancel retransmits and the timeout for that SYN_ACK.</span></div>
<div class="line"><a id="l00613" name="l00613"></a><span class="lineno">  613</span>  <a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#a3f9cf4d7160b3e27b3b0131fc4507ce7">cancel_timers</a>(sock);</div>
<div class="line"><a id="l00614" name="l00614"></a><span class="lineno">  614</span> </div>
<div class="line"><a id="l00615" name="l00615"></a><span class="lineno">  615</span>  <span class="comment">// Setup the Drop Timeout engine (m_snd_drop_timer).</span></div>
<div class="line"><a id="l00616" name="l00616"></a><span class="lineno">  616</span>  <a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#ab427ebc124a6233ae48a7562662a6e81">setup_drop_timer</a>(<a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#a99836ffb51eaefa4d2cc21770461cd97">socket_id</a>, sock);</div>
<div class="line"><a id="l00617" name="l00617"></a><span class="lineno">  617</span> </div>
<div class="line"><a id="l00618" name="l00618"></a><span class="lineno">  618</span>  <span class="comment">// Add the peer socket to the server socket&#39;s accept queue (thread-safe)!  accept() will return this.</span></div>
<div class="line"><a id="l00619" name="l00619"></a><span class="lineno">  619</span>  <a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#abf0204e999b5dc28ee9b5db6eae9aa1a">serv_peer_socket_acceptable</a>(serv, sock);</div>
<div class="line"><a id="l00620" name="l00620"></a><span class="lineno">  620</span>  <span class="comment">// BTW serv-&gt;m_originating_serv is now null.</span></div>
<div class="line"><a id="l00621" name="l00621"></a><span class="lineno">  621</span> </div>
<div class="line"><a id="l00622" name="l00622"></a><span class="lineno">  622</span>  <span class="comment">// Record initial rcv_wnd; it should be the entire size of the other side&#39;s Receive buffer.</span></div>
<div class="line"><a id="l00623" name="l00623"></a><span class="lineno">  623</span>  sock-&gt;m_snd_remote_rcv_wnd = syn_ack_ack-&gt;m_packed.m_rcv_wnd;</div>
<div class="line"><a id="l00624" name="l00624"></a><span class="lineno">  624</span> </div>
<div class="line"><a id="l00625" name="l00625"></a><span class="lineno">  625</span>  <span class="comment">/* We may have queued up some DATA packets while we were SYN_RCVD (due to loss and/or</span></div>
<div class="line"><a id="l00626" name="l00626"></a><span class="lineno">  626</span><span class="comment">   * re-ordering).  See handle_data_to_syn_rcvd() for more information.  So, handle the queued DATA</span></div>
<div class="line"><a id="l00627" name="l00627"></a><span class="lineno">  627</span><span class="comment">   * packets as if they&#39;d just arrived. */</span></div>
<div class="line"><a id="l00628" name="l00628"></a><span class="lineno">  628</span>  <span class="keywordflow">for</span> (shared_ptr&lt;Data_packet&gt; qd_packet : sock-&gt;m_rcv_syn_rcvd_data_q)</div>
<div class="line"><a id="l00629" name="l00629"></a><span class="lineno">  629</span>  {</div>
<div class="line"><a id="l00630" name="l00630"></a><span class="lineno">  630</span>    <span class="keyword">auto</span> <span class="keyword">const</span> logger_ptr = <a class="code hl_function" href="classflow_1_1log_1_1Log__context.html#af4db395042b065b00398cd59845dcb4d">get_logger</a>();</div>
<div class="line"><a id="l00631" name="l00631"></a><span class="lineno">  631</span>    <span class="keywordflow">if</span> (logger_ptr &amp;&amp; logger_ptr-&gt;should_log(<a class="code hl_enumvalue" href="namespaceflow_1_1log.html#a5c602384e6fe9d7642740ac2fae4ad04a3ee808b04c34bf6c110e3754de277f7b">log::Sev::S_TRACE</a>, <a class="code hl_function" href="classflow_1_1log_1_1Log__context.html#a8a5fef42dc2cedf3c0d1a6e83beb2948">get_log_component</a>()))</div>
<div class="line"><a id="l00632" name="l00632"></a><span class="lineno">  632</span>    {</div>
<div class="line"><a id="l00633" name="l00633"></a><span class="lineno">  633</span>      <a class="code hl_define" href="log_8hpp.html#a6b3b2cd7ddabf90a7c6ccd104a042cc6">FLOW_LOG_TRACE_WITHOUT_CHECKING</a></div>
<div class="line"><a id="l00634" name="l00634"></a><span class="lineno">  634</span>        (<span class="stringliteral">&quot;Handling [&quot;</span> &lt;&lt; qd_packet-&gt;m_type_ostream_manip &lt;&lt; <span class="stringliteral">&quot;] packet &quot;</span></div>
<div class="line"><a id="l00635" name="l00635"></a><span class="lineno">  635</span>         <span class="stringliteral">&quot;received/queued in [&quot;</span> &lt;&lt; <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Peer__socket.html#a9537860c2c2a7380a45a525e5121880fa9838c717b26793d3b5360e4d718dc2d2">Peer_socket::Int_state::S_SYN_RCVD</a> &lt;&lt; <span class="stringliteral">&quot;] state; &quot;</span></div>
<div class="line"><a id="l00636" name="l00636"></a><span class="lineno">  636</span>         <span class="stringliteral">&quot;packet data size = [&quot;</span> &lt;&lt; qd_packet-&gt;m_data.size() &lt;&lt; <span class="stringliteral">&quot;].&quot;</span>);</div>
<div class="line"><a id="l00637" name="l00637"></a><span class="lineno">  637</span> </div>
<div class="line"><a id="l00638" name="l00638"></a><span class="lineno">  638</span>      <span class="comment">// Very verbose and CPU-intensive, especially DATA version!</span></div>
<div class="line"><a id="l00639" name="l00639"></a><span class="lineno">  639</span>      <span class="keywordflow">if</span> (logger_ptr-&gt;should_log(<a class="code hl_enumvalue" href="namespaceflow_1_1log.html#a5c602384e6fe9d7642740ac2fae4ad04a138fe9b2eb78ab00c84b21c4a6b48fed">log::Sev::S_DATA</a>, <a class="code hl_function" href="classflow_1_1log_1_1Log__context.html#a8a5fef42dc2cedf3c0d1a6e83beb2948">get_log_component</a>()))</div>
<div class="line"><a id="l00640" name="l00640"></a><span class="lineno">  640</span>      {</div>
<div class="line"><a id="l00641" name="l00641"></a><span class="lineno">  641</span>        <a class="code hl_define" href="log_8hpp.html#a9aa1d91ba9eb26345d4b83588ac489cb">FLOW_LOG_DATA_WITHOUT_CHECKING</a>(<span class="stringliteral">&quot;Readable representation is: &quot;</span></div>
<div class="line"><a id="l00642" name="l00642"></a><span class="lineno">  642</span>                                       <span class="stringliteral">&quot;[\n&quot;</span> &lt;&lt; qd_packet-&gt;m_verbose_ostream_manip &lt;&lt; <span class="stringliteral">&quot;].&quot;</span>);</div>
<div class="line"><a id="l00643" name="l00643"></a><span class="lineno">  643</span>      }</div>
<div class="line"><a id="l00644" name="l00644"></a><span class="lineno">  644</span>      <span class="keywordflow">else</span></div>
<div class="line"><a id="l00645" name="l00645"></a><span class="lineno">  645</span>      {</div>
<div class="line"><a id="l00646" name="l00646"></a><span class="lineno">  646</span>        <a class="code hl_define" href="log_8hpp.html#a6b3b2cd7ddabf90a7c6ccd104a042cc6">FLOW_LOG_TRACE_WITHOUT_CHECKING</a>(<span class="stringliteral">&quot;Readable representation is: &quot;</span></div>
<div class="line"><a id="l00647" name="l00647"></a><span class="lineno">  647</span>                                        <span class="stringliteral">&quot;[\n&quot;</span> &lt;&lt; qd_packet-&gt;m_concise_ostream_manip &lt;&lt; <span class="stringliteral">&quot;].&quot;</span>);</div>
<div class="line"><a id="l00648" name="l00648"></a><span class="lineno">  648</span>      }</div>
<div class="line"><a id="l00649" name="l00649"></a><span class="lineno">  649</span>    }</div>
<div class="line"><a id="l00650" name="l00650"></a><span class="lineno">  650</span> </div>
<div class="line"><a id="l00651" name="l00651"></a><span class="lineno">  651</span>    <a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#a06e4cea2eefa1b06975864f09740c96b">handle_data_to_established</a>(<a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#a99836ffb51eaefa4d2cc21770461cd97">socket_id</a>, sock, qd_packet, <span class="keyword">true</span>); <span class="comment">// true &lt;=&gt; packet was queued during SYN_RCVD.</span></div>
<div class="line"><a id="l00652" name="l00652"></a><span class="lineno">  652</span>    <span class="comment">// qd_packet has probably been decimated for performance, so don&#39;t rely on qd_packet.m_data at this point!</span></div>
<div class="line"><a id="l00653" name="l00653"></a><span class="lineno">  653</span>  }</div>
<div class="line"><a id="l00654" name="l00654"></a><span class="lineno">  654</span>  <span class="keywordflow">if</span> (!sock-&gt;m_rcv_syn_rcvd_data_q.empty())</div>
<div class="line"><a id="l00655" name="l00655"></a><span class="lineno">  655</span>  {</div>
<div class="line"><a id="l00656" name="l00656"></a><span class="lineno">  656</span>    <a class="code hl_define" href="log_8hpp.html#affcf2e4c496ce3f42adf981669c623b8">FLOW_LOG_TRACE</a>(<span class="stringliteral">&quot;Handled a total of [&quot;</span> &lt;&lt; sock-&gt;m_rcv_syn_rcvd_data_q.size() &lt;&lt; <span class="stringliteral">&quot;] queued packets with &quot;</span></div>
<div class="line"><a id="l00657" name="l00657"></a><span class="lineno">  657</span>                   <span class="stringliteral">&quot;cumulative data size [&quot;</span> &lt;&lt; sock-&gt;m_rcv_syn_rcvd_data_cumulative_size &lt;&lt; <span class="stringliteral">&quot;].&quot;</span>);</div>
<div class="line"><a id="l00658" name="l00658"></a><span class="lineno">  658</span>  }</div>
<div class="line"><a id="l00659" name="l00659"></a><span class="lineno">  659</span>  sock-&gt;m_rcv_syn_rcvd_data_q.clear(); <span class="comment">// Save memory.</span></div>
<div class="line"><a id="l00660" name="l00660"></a><span class="lineno">  660</span> </div>
<div class="line"><a id="l00661" name="l00661"></a><span class="lineno">  661</span>  <span class="comment">/* Since we just added sock to serv&#39;s acceptable socket queue, certainly serv is now Acceptable.</span></div>
<div class="line"><a id="l00662" name="l00662"></a><span class="lineno">  662</span><span class="comment">   * Therefore we should soon inform anyone waiting on any Event_sets for serv to become Acceptable.</span></div>
<div class="line"><a id="l00663" name="l00663"></a><span class="lineno">  663</span><span class="comment">   *</span></div>
<div class="line"><a id="l00664" name="l00664"></a><span class="lineno">  664</span><span class="comment">   * Caveat: The user could have called serv-&gt;accept() right after the previous statement in this</span></div>
<div class="line"><a id="l00665" name="l00665"></a><span class="lineno">  665</span><span class="comment">   * method, which could indeed make serv not Acceptable again.  That is OK.  We only promise to</span></div>
<div class="line"><a id="l00666" name="l00666"></a><span class="lineno">  666</span><span class="comment">   * inform the user of an event within a &quot;non-blocking&quot; amount of time of it occurring.  If that</span></div>
<div class="line"><a id="l00667" name="l00667"></a><span class="lineno">  667</span><span class="comment">   * same user decides to mess himself over by acting on these events prematurely, that is not our</span></div>
<div class="line"><a id="l00668" name="l00668"></a><span class="lineno">  668</span><span class="comment">   * problem [assuming we don&#39;t crash things, which we do not].  Worst case is that the user will</span></div>
<div class="line"><a id="l00669" name="l00669"></a><span class="lineno">  669</span><span class="comment">   * detect the event, try to accept() and get nothing [which is an eventuality for which any decent</span></div>
<div class="line"><a id="l00670" name="l00670"></a><span class="lineno">  670</span><span class="comment">   * user code would prepare]. */</span></div>
<div class="line"><a id="l00671" name="l00671"></a><span class="lineno">  671</span> </div>
<div class="line"><a id="l00672" name="l00672"></a><span class="lineno">  672</span>  <span class="comment">// Accumulate the event into the Node store (note: not any Event_set yet).</span></div>
<div class="line"><a id="l00673" name="l00673"></a><span class="lineno">  673</span>  <span class="keywordflow">if</span> (<a class="code hl_variable" href="classflow_1_1net__flow_1_1Node.html#ab0026feecdb74eda904d00d2c7016bab">m_sock_events</a>[<a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a19cc3a286c8a11c986d2a59ec1e39a71afb218b0110d3f9f26ee089bad2e0eba2">Event_set::Event_type::S_SERVER_SOCKET_ACCEPTABLE</a>].insert(serv).second)</div>
<div class="line"><a id="l00674" name="l00674"></a><span class="lineno">  674</span>  {</div>
<div class="line"><a id="l00675" name="l00675"></a><span class="lineno">  675</span>    <span class="comment">// Possibly inform the user for any applicable Event_sets right now.</span></div>
<div class="line"><a id="l00676" name="l00676"></a><span class="lineno">  676</span>    <a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#a8a4ddf81ddbeab1f740940c4cc0d3625">event_set_all_check_delta</a>(<span class="keyword">true</span>);</div>
<div class="line"><a id="l00677" name="l00677"></a><span class="lineno">  677</span>    <span class="comment">/* ^-- defer_delta_check == true: because the only way to get to this method is from</span></div>
<div class="line"><a id="l00678" name="l00678"></a><span class="lineno">  678</span><span class="comment">     * async_low_lvl_recv(), which will perform event_set_all_check_delta(false) at the end of itself,</span></div>
<div class="line"><a id="l00679" name="l00679"></a><span class="lineno">  679</span><span class="comment">     * before the boost.asio handler exits.  See Node::m_sock_events doc header for details. */</span></div>
<div class="line"><a id="l00680" name="l00680"></a><span class="lineno">  680</span>  }</div>
<div class="line"><a id="l00681" name="l00681"></a><span class="lineno">  681</span> </div>
<div class="line"><a id="l00682" name="l00682"></a><span class="lineno">  682</span>  <span class="comment">/* Do not m_sock_events[S_PEER_SOCKET_WRITABLE].insert(sock), as sock has not been accept()ed and</span></div>
<div class="line"><a id="l00683" name="l00683"></a><span class="lineno">  683</span><span class="comment">   * therefore cannot be waited on currently. */</span></div>
<div class="line"><a id="l00684" name="l00684"></a><span class="lineno">  684</span>} <span class="comment">// Node::handle_syn_ack_ack_to_syn_rcvd()</span></div>
<div class="line"><a id="l00685" name="l00685"></a><span class="lineno">  685</span> </div>
<div class="line"><a id="l00686" name="l00686"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Node.html#abf80b7de1398e93d1d4289ef5bf2ae2c">  686</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#abf80b7de1398e93d1d4289ef5bf2ae2c">Node::handle_data_to_syn_rcvd</a>(<a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Peer_socket::Ptr</a> sock,</div>
<div class="line"><a id="l00687" name="l00687"></a><span class="lineno">  687</span>                                   boost::shared_ptr&lt;Data_packet&gt; packet)</div>
<div class="line"><a id="l00688" name="l00688"></a><span class="lineno">  688</span>{</div>
<div class="line"><a id="l00689" name="l00689"></a><span class="lineno">  689</span>  <span class="comment">// We are in thread W.</span></div>
<div class="line"><a id="l00690" name="l00690"></a><span class="lineno">  690</span> </div>
<div class="line"><a id="l00691" name="l00691"></a><span class="lineno">  691</span>  <span class="comment">/* We&#39;d sent SYN_ACK, were waiting for SYN_ACK_ACK, but instead we got a DATA.</span></div>
<div class="line"><a id="l00692" name="l00692"></a><span class="lineno">  692</span><span class="comment">   * This seems wrong at a first glance but can be legitimate.  One possibility is they sent</span></div>
<div class="line"><a id="l00693" name="l00693"></a><span class="lineno">  693</span><span class="comment">   * SYN_ACK_ACK and then some DATA, but the SYN_ACK_ACK was dropped (recall that the SYN_ACK_ACK is</span></div>
<div class="line"><a id="l00694" name="l00694"></a><span class="lineno">  694</span><span class="comment">   * not itself acknowledged in our scheme).  Another possibility is they sent both, but then DATA</span></div>
<div class="line"><a id="l00695" name="l00695"></a><span class="lineno">  695</span><span class="comment">   * got re-ordered to in front of SYN_ACK_ACK.</span></div>
<div class="line"><a id="l00696" name="l00696"></a><span class="lineno">  696</span><span class="comment">   *</span></div>
<div class="line"><a id="l00697" name="l00697"></a><span class="lineno">  697</span><span class="comment">   * What does TCP do here?  Well, it doesn&#39;t really have this problem, because every segment must</span></div>
<div class="line"><a id="l00698" name="l00698"></a><span class="lineno">  698</span><span class="comment">   * have an ACK in it.  So if a TCP gets data in SYN_RCVD, it must also contain the ACK to the</span></div>
<div class="line"><a id="l00699" name="l00699"></a><span class="lineno">  699</span><span class="comment">   * SYN_ACK (what we call SYN_ACK_ACK) (in TCP, any packet without ACK is simply considered</span></div>
<div class="line"><a id="l00700" name="l00700"></a><span class="lineno">  700</span><span class="comment">   * corrupt/invalid and would not be sent in the first place).  So it&#39;s impossible to send data</span></div>
<div class="line"><a id="l00701" name="l00701"></a><span class="lineno">  701</span><span class="comment">   * without acknowledging the SYN_ACK at the same time.</span></div>
<div class="line"><a id="l00702" name="l00702"></a><span class="lineno">  702</span><span class="comment">   *</span></div>
<div class="line"><a id="l00703" name="l00703"></a><span class="lineno">  703</span><span class="comment">   * For us, however ACK packets are independent of DATA packets, as are SYN_ACK_ACK packets.</span></div>
<div class="line"><a id="l00704" name="l00704"></a><span class="lineno">  704</span><span class="comment">   * Therefore we should either drop these DATAs and hope whatever reliability implementation is</span></div>
<div class="line"><a id="l00705" name="l00705"></a><span class="lineno">  705</span><span class="comment">   * used restores them later, or we should queue them for consumption when ESTABLISHED arrives.</span></div>
<div class="line"><a id="l00706" name="l00706"></a><span class="lineno">  706</span><span class="comment">   * Let&#39;s do the latter.  It&#39;s hard enough to deal with actual loss; introducing loss when we</span></div>
<div class="line"><a id="l00707" name="l00707"></a><span class="lineno">  707</span><span class="comment">   * actually have the stuff seems absurd.</span></div>
<div class="line"><a id="l00708" name="l00708"></a><span class="lineno">  708</span><span class="comment">   *</span></div>
<div class="line"><a id="l00709" name="l00709"></a><span class="lineno">  709</span><span class="comment">   * So we just save them in a packet queue, and when we&#39;re ESTABLISHED we feed all the packets to</span></div>
<div class="line"><a id="l00710" name="l00710"></a><span class="lineno">  710</span><span class="comment">   * handle_incoming() as if they&#39;d just arrived.  The only caveat is size of this queue.  Since</span></div>
<div class="line"><a id="l00711" name="l00711"></a><span class="lineno">  711</span><span class="comment">   * we have a maximum on the Receive buffer (sock-&gt;m_rcv_buf) and the packets-with-gaps structure</span></div>
<div class="line"><a id="l00712" name="l00712"></a><span class="lineno">  712</span><span class="comment">   * (sock-&gt;m_rcv_packets_with_gaps), we must have one here as well.  Since Receive buffer is</span></div>
<div class="line"><a id="l00713" name="l00713"></a><span class="lineno">  713</span><span class="comment">   * empty until ESTABLISHED, it seems natural to limit this queue&#39;s cumulative byte size</span></div>
<div class="line"><a id="l00714" name="l00714"></a><span class="lineno">  714</span><span class="comment">   * according to the limit imposed on Receive buffer.  (There is some extra overhead to store the</span></div>
<div class="line"><a id="l00715" name="l00715"></a><span class="lineno">  715</span><span class="comment">   * packet header info, but it&#39;s close enough.)  After that, as when the Receive buffer fills up,</span></div>
<div class="line"><a id="l00716" name="l00716"></a><span class="lineno">  716</span><span class="comment">   * we drop packets. */</span></div>
<div class="line"><a id="l00717" name="l00717"></a><span class="lineno">  717</span> </div>
<div class="line"><a id="l00718" name="l00718"></a><span class="lineno">  718</span>  assert(sock-&gt;m_int_state == <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Peer__socket.html#a9537860c2c2a7380a45a525e5121880fa9838c717b26793d3b5360e4d718dc2d2">Peer_socket::Int_state::S_SYN_RCVD</a>);</div>
<div class="line"><a id="l00719" name="l00719"></a><span class="lineno">  719</span>  <span class="keyword">const</span> <span class="keywordtype">bool</span> first_time = sock-&gt;m_rcv_syn_rcvd_data_q.empty();</div>
<div class="line"><a id="l00720" name="l00720"></a><span class="lineno">  720</span> </div>
<div class="line"><a id="l00721" name="l00721"></a><span class="lineno">  721</span>  <span class="comment">// Not a WARNING, because we didn&#39;t do anything wrong; could be network conditions; and avoid verbosity after 1st one.</span></div>
<div class="line"><a id="l00722" name="l00722"></a><span class="lineno">  722</span>  <a class="code hl_define" href="log_8hpp.html#a692bbadd8b5c3e9cef7a0bbea1915e66">FLOW_LOG_WITH_CHECKING</a>(first_time ? <a class="code hl_enumvalue" href="namespaceflow_1_1log.html#a5c602384e6fe9d7642740ac2fae4ad04ac238793326fae17afcc849e96b96e8e7">log::Sev::S_INFO</a> : <a class="code hl_enumvalue" href="namespaceflow_1_1log.html#a5c602384e6fe9d7642740ac2fae4ad04a3ee808b04c34bf6c110e3754de277f7b">log::Sev::S_TRACE</a>,</div>
<div class="line"><a id="l00723" name="l00723"></a><span class="lineno">  723</span>                         <span class="stringliteral">&quot;NetFlow worker thread received [&quot;</span> &lt;&lt; packet-&gt;m_type_ostream_manip &lt;&lt; <span class="stringliteral">&quot;] packet while &quot;</span></div>
<div class="line"><a id="l00724" name="l00724"></a><span class="lineno">  724</span>                           <span class="stringliteral">&quot;in [&quot;</span> &lt;&lt; <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Peer__socket.html#a9537860c2c2a7380a45a525e5121880fa9838c717b26793d3b5360e4d718dc2d2">Peer_socket::Int_state::S_SYN_RCVD</a> &lt;&lt; <span class="stringliteral">&quot;] state for [&quot;</span> &lt;&lt; sock &lt;&lt; <span class="stringliteral">&quot;]; &quot;</span></div>
<div class="line"><a id="l00725" name="l00725"></a><span class="lineno">  725</span>                           <span class="stringliteral">&quot;saving for processing later when in [&quot;</span> &lt;&lt; <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Peer__socket.html#a9537860c2c2a7380a45a525e5121880fa16fdfce85d7bca9386378acd29eb7202">Peer_socket::Int_state::S_ESTABLISHED</a> &lt;&lt; <span class="stringliteral">&quot;] &quot;</span></div>
<div class="line"><a id="l00726" name="l00726"></a><span class="lineno">  726</span>                           <span class="stringliteral">&quot;state; packet data size = [&quot;</span> &lt;&lt; packet-&gt;m_data.size() &lt;&lt; <span class="stringliteral">&quot;]; &quot;</span></div>
<div class="line"><a id="l00727" name="l00727"></a><span class="lineno">  727</span>                           <span class="stringliteral">&quot;first time? = [&quot;</span> &lt;&lt; first_time &lt;&lt; <span class="stringliteral">&quot;].&quot;</span>);</div>
<div class="line"><a id="l00728" name="l00728"></a><span class="lineno">  728</span> </div>
<div class="line"><a id="l00729" name="l00729"></a><span class="lineno">  729</span>  <span class="keywordflow">if</span> (first_time)</div>
<div class="line"><a id="l00730" name="l00730"></a><span class="lineno">  730</span>  {</div>
<div class="line"><a id="l00731" name="l00731"></a><span class="lineno">  731</span>    sock-&gt;m_rcv_syn_rcvd_data_cumulative_size = 0; <span class="comment">// It&#39;s garbage at the moment.</span></div>
<div class="line"><a id="l00732" name="l00732"></a><span class="lineno">  732</span>  }</div>
<div class="line"><a id="l00733" name="l00733"></a><span class="lineno">  733</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((sock-&gt;m_rcv_syn_rcvd_data_cumulative_size + packet-&gt;m_data.size())</div>
<div class="line"><a id="l00734" name="l00734"></a><span class="lineno">  734</span>           &gt; sock-&gt;opt(sock-&gt;m_opts.m_st_snd_buf_max_size))</div>
<div class="line"><a id="l00735" name="l00735"></a><span class="lineno">  735</span>  {</div>
<div class="line"><a id="l00736" name="l00736"></a><span class="lineno">  736</span>    <span class="comment">// Not a WARNING, because we didn&#39;t do anything wrong; could be network conditions.</span></div>
<div class="line"><a id="l00737" name="l00737"></a><span class="lineno">  737</span>    <a class="code hl_define" href="log_8hpp.html#a325fdd4b5cf0be49b37d3b7b7c29070d">FLOW_LOG_INFO</a>(<span class="stringliteral">&quot;NetFlow worker thread received [&quot;</span> &lt;&lt; packet-&gt;m_type_ostream_manip &lt;&lt; <span class="stringliteral">&quot;] packet while &quot;</span></div>
<div class="line"><a id="l00738" name="l00738"></a><span class="lineno">  738</span>                  <span class="stringliteral">&quot;in [&quot;</span> &lt;&lt; <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Peer__socket.html#a9537860c2c2a7380a45a525e5121880fa9838c717b26793d3b5360e4d718dc2d2">Peer_socket::Int_state::S_SYN_RCVD</a> &lt;&lt; <span class="stringliteral">&quot;] state for [&quot;</span> &lt;&lt; sock &lt;&lt; <span class="stringliteral">&quot;]; &quot;</span></div>
<div class="line"><a id="l00739" name="l00739"></a><span class="lineno">  739</span>                  <span class="stringliteral">&quot;dropping because Receive queue full at [&quot;</span> &lt;&lt; sock-&gt;m_rcv_syn_rcvd_data_cumulative_size &lt;&lt; <span class="stringliteral">&quot;].&quot;</span>);</div>
<div class="line"><a id="l00740" name="l00740"></a><span class="lineno">  740</span>    <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00741" name="l00741"></a><span class="lineno">  741</span>  }</div>
<div class="line"><a id="l00742" name="l00742"></a><span class="lineno">  742</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l00743" name="l00743"></a><span class="lineno">  743</span> </div>
<div class="line"><a id="l00744" name="l00744"></a><span class="lineno">  744</span>  sock-&gt;m_rcv_syn_rcvd_data_cumulative_size += packet-&gt;m_data.size();</div>
<div class="line"><a id="l00745" name="l00745"></a><span class="lineno">  745</span>  sock-&gt;m_rcv_syn_rcvd_data_q.push_back(packet); <span class="comment">// Note that this is not a copy of the packet (just a pointer).</span></div>
<div class="line"><a id="l00746" name="l00746"></a><span class="lineno">  746</span> </div>
<div class="line"><a id="l00747" name="l00747"></a><span class="lineno">  747</span>  <a class="code hl_define" href="log_8hpp.html#affcf2e4c496ce3f42adf981669c623b8">FLOW_LOG_TRACE</a>(<span class="stringliteral">&quot;Receive queue now has [&quot;</span> &lt;&lt; sock-&gt;m_rcv_syn_rcvd_data_q.size() &lt;&lt; <span class="stringliteral">&quot;] packets; &quot;</span></div>
<div class="line"><a id="l00748" name="l00748"></a><span class="lineno">  748</span>                 <span class="stringliteral">&quot;cumulative data size is [&quot;</span> &lt;&lt; sock-&gt;m_rcv_syn_rcvd_data_cumulative_size &lt;&lt; <span class="stringliteral">&quot;].&quot;</span>);</div>
<div class="line"><a id="l00749" name="l00749"></a><span class="lineno">  749</span>} <span class="comment">// Node::handle_data_to_syn_rcvd()</span></div>
<div class="line"><a id="l00750" name="l00750"></a><span class="lineno">  750</span> </div>
<div class="line"><a id="l00751" name="l00751"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Node.html#a2af9ec4f1483cd9a2183286f7dfa9c87">  751</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#a2af9ec4f1483cd9a2183286f7dfa9c87">Node::serv_close_detected</a>(<a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Server_socket::Ptr</a> serv,</div>
<div class="line"><a id="l00752" name="l00752"></a><span class="lineno">  752</span>                               <span class="keyword">const</span> <a class="code hl_typedef" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09">Error_code</a>&amp; disconnect_cause, <span class="keywordtype">bool</span> close)</div>
<div class="line"><a id="l00753" name="l00753"></a><span class="lineno">  753</span>{</div>
<div class="line"><a id="l00754" name="l00754"></a><span class="lineno">  754</span>  <span class="comment">/* @todo Nothing calls this yet, as we don&#39;t support any way to close a Server_socket yet.</span></div>
<div class="line"><a id="l00755" name="l00755"></a><span class="lineno">  755</span><span class="comment">   * Probably will reconsider this method when we do. */</span></div>
<div class="line"><a id="l00756" name="l00756"></a><span class="lineno">  756</span> </div>
<div class="line"><a id="l00757" name="l00757"></a><span class="lineno">  757</span>  <a class="code hl_typedef" href="classflow_1_1net__flow_1_1Server__socket.html#ad428b65f60ee317aff7a0ad7f7a8f56d">Server_socket::Lock_guard</a> lock(serv-&gt;m_mutex);</div>
<div class="line"><a id="l00758" name="l00758"></a><span class="lineno">  758</span>  serv-&gt;m_disconnect_cause = disconnect_cause;</div>
<div class="line"><a id="l00759" name="l00759"></a><span class="lineno">  759</span>  <span class="keywordflow">if</span> (close)</div>
<div class="line"><a id="l00760" name="l00760"></a><span class="lineno">  760</span>  {</div>
<div class="line"><a id="l00761" name="l00761"></a><span class="lineno">  761</span>    <span class="comment">// DONE.</span></div>
<div class="line"><a id="l00762" name="l00762"></a><span class="lineno">  762</span>    <a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#a0bac29a091e1026e5b4f0b5d84a710c7">serv_set_state</a>(serv, <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Server__socket.html#a8bc789b851677a47d7c0a1aa0c69a997a6abcbd1be8478aa03e76aec9c540e14f">Server_socket::State::S_CLOSED</a>); <span class="comment">// Reentrant mutex =&gt; OK.</span></div>
<div class="line"><a id="l00763" name="l00763"></a><span class="lineno">  763</span>  }</div>
<div class="line"><a id="l00764" name="l00764"></a><span class="lineno">  764</span>  <span class="keywordflow">else</span></div>
<div class="line"><a id="l00765" name="l00765"></a><span class="lineno">  765</span>  {</div>
<div class="line"><a id="l00766" name="l00766"></a><span class="lineno">  766</span>    <span class="comment">// This socket is screwed but not yet out of the Node&#39;s system.</span></div>
<div class="line"><a id="l00767" name="l00767"></a><span class="lineno">  767</span>    <a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#a0bac29a091e1026e5b4f0b5d84a710c7">serv_set_state</a>(serv, <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Server__socket.html#a8bc789b851677a47d7c0a1aa0c69a997aa27ca0689984ee6c6784a9265a678d42">Server_socket::State::S_CLOSING</a>); <span class="comment">// Reentrant mutex =&gt; OK.</span></div>
<div class="line"><a id="l00768" name="l00768"></a><span class="lineno">  768</span>  }</div>
<div class="line"><a id="l00769" name="l00769"></a><span class="lineno">  769</span>}</div>
<div class="line"><a id="l00770" name="l00770"></a><span class="lineno">  770</span> </div>
<div class="line"><a id="l00771" name="l00771"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Node.html#a8a6c02bf520a16df4028bd3c88732a8d">  771</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#a8a6c02bf520a16df4028bd3c88732a8d">Node::serv_peer_socket_closed</a>(<a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Server_socket::Ptr</a> serv, <a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Peer_socket::Ptr</a> sock)</div>
<div class="line"><a id="l00772" name="l00772"></a><span class="lineno">  772</span>{</div>
<div class="line"><a id="l00773" name="l00773"></a><span class="lineno">  773</span>  <span class="keyword">using </span>std::list;</div>
<div class="line"><a id="l00774" name="l00774"></a><span class="lineno">  774</span> </div>
<div class="line"><a id="l00775" name="l00775"></a><span class="lineno">  775</span>  <span class="comment">// We are in thread W.</span></div>
<div class="line"><a id="l00776" name="l00776"></a><span class="lineno">  776</span> </div>
<div class="line"><a id="l00777" name="l00777"></a><span class="lineno">  777</span>  <span class="comment">/* sock is in one of two stages:</span></div>
<div class="line"><a id="l00778" name="l00778"></a><span class="lineno">  778</span><span class="comment">   *   - stage 1: serv-&gt;m_connecting_socks (not available via accept()), the earlier stage;</span></div>
<div class="line"><a id="l00779" name="l00779"></a><span class="lineno">  779</span><span class="comment">   *   - stage 2: serv-&gt;m_unaccepted_socks (available via accept()), the later stage.</span></div>
<div class="line"><a id="l00780" name="l00780"></a><span class="lineno">  780</span><span class="comment">   *</span></div>
<div class="line"><a id="l00781" name="l00781"></a><span class="lineno">  781</span><span class="comment">   * Try stage 1, then stage 2. */</span></div>
<div class="line"><a id="l00782" name="l00782"></a><span class="lineno">  782</span> </div>
<div class="line"><a id="l00783" name="l00783"></a><span class="lineno">  783</span>  <span class="comment">// Stage 1.</span></div>
<div class="line"><a id="l00784" name="l00784"></a><span class="lineno">  784</span>  <span class="keyword">const</span> <span class="keywordtype">bool</span> erased = serv-&gt;m_connecting_socks.erase(sock) == 1;</div>
<div class="line"><a id="l00785" name="l00785"></a><span class="lineno">  785</span>  <span class="keywordflow">if</span> (erased)</div>
<div class="line"><a id="l00786" name="l00786"></a><span class="lineno">  786</span>  {</div>
<div class="line"><a id="l00787" name="l00787"></a><span class="lineno">  787</span>    <span class="comment">/* Maintain invariant.  No need to lock mutex, because sock is in serv-&gt;m_connecting_socks, which</span></div>
<div class="line"><a id="l00788" name="l00788"></a><span class="lineno">  788</span><span class="comment">     * means it is not in serv-&gt;m_unaccepted_socks yet, which means accept() cannot yield it, which means</span></div>
<div class="line"><a id="l00789" name="l00789"></a><span class="lineno">  789</span><span class="comment">     * no non-W thread could be accessing m_originating_serv at the same time. */</span></div>
<div class="line"><a id="l00790" name="l00790"></a><span class="lineno">  790</span>    sock-&gt;m_originating_serv.reset();</div>
<div class="line"><a id="l00791" name="l00791"></a><span class="lineno">  791</span>    <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00792" name="l00792"></a><span class="lineno">  792</span>  }</div>
<div class="line"><a id="l00793" name="l00793"></a><span class="lineno">  793</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l00794" name="l00794"></a><span class="lineno">  794</span> </div>
<div class="line"><a id="l00795" name="l00795"></a><span class="lineno">  795</span>  <span class="comment">// Stage 2.</span></div>
<div class="line"><a id="l00796" name="l00796"></a><span class="lineno">  796</span> </div>
<div class="line"><a id="l00797" name="l00797"></a><span class="lineno">  797</span>  <span class="comment">/* Remove from serv-&gt;m_unaccepted_socks.  At this point accept() can access serv-&gt;m_unaccepted_socks and</span></div>
<div class="line"><a id="l00798" name="l00798"></a><span class="lineno">  798</span><span class="comment">   * m_originating_serv, so we must lock. */</span></div>
<div class="line"><a id="l00799" name="l00799"></a><span class="lineno">  799</span>  <a class="code hl_typedef" href="classflow_1_1net__flow_1_1Server__socket.html#ad428b65f60ee317aff7a0ad7f7a8f56d">Server_socket::Lock_guard</a> lock(serv-&gt;m_mutex);</div>
<div class="line"><a id="l00800" name="l00800"></a><span class="lineno">  800</span> </div>
<div class="line"><a id="l00801" name="l00801"></a><span class="lineno">  801</span>  sock-&gt;m_originating_serv.reset(); <span class="comment">// Maintain invariant.</span></div>
<div class="line"><a id="l00802" name="l00802"></a><span class="lineno">  802</span> </div>
<div class="line"><a id="l00803" name="l00803"></a><span class="lineno">  803</span>  <span class="comment">// O(1)ish.</span></div>
<div class="line"><a id="l00804" name="l00804"></a><span class="lineno">  804</span>  serv-&gt;m_unaccepted_socks.erase(sock);</div>
<div class="line"><a id="l00805" name="l00805"></a><span class="lineno">  805</span> </div>
<div class="line"><a id="l00806" name="l00806"></a><span class="lineno">  806</span>  <span class="comment">/* Notes:</span></div>
<div class="line"><a id="l00807" name="l00807"></a><span class="lineno">  807</span><span class="comment">   *</span></div>
<div class="line"><a id="l00808" name="l00808"></a><span class="lineno">  808</span><span class="comment">   * The unaccepted socket queue of serv can be accessed by accept()ing threads outside</span></div>
<div class="line"><a id="l00809" name="l00809"></a><span class="lineno">  809</span><span class="comment">   * of thread W.  So we must lock object at least to avoid corruption.  We do that above.</span></div>
<div class="line"><a id="l00810" name="l00810"></a><span class="lineno">  810</span><span class="comment">   *</span></div>
<div class="line"><a id="l00811" name="l00811"></a><span class="lineno">  811</span><span class="comment">   * Now, let&#39;s think about the race.  Suppose close_connection_immediately() starts and wins</span></div>
<div class="line"><a id="l00812" name="l00812"></a><span class="lineno">  812</span><span class="comment">   * the race to lock *this; removes sock from serv-&gt;m_unaccepted_socks; unlocks *this; then the</span></div>
<div class="line"><a id="l00813" name="l00813"></a><span class="lineno">  813</span><span class="comment">   * user immediately gets to call accept().  The user will not get sock as the result of the</span></div>
<div class="line"><a id="l00814" name="l00814"></a><span class="lineno">  814</span><span class="comment">   * accept(), as we&#39;d removed it in time.  Good.  Now suppose close_connection_immediately() starts</span></div>
<div class="line"><a id="l00815" name="l00815"></a><span class="lineno">  815</span><span class="comment">   * but loses the race to lock *sock; user calls accept() first, and accept() yields sock (in</span></div>
<div class="line"><a id="l00816" name="l00816"></a><span class="lineno">  816</span><span class="comment">   * S_ESTABLISHED state, though with empty Receive buffer, which is a pre-condition for</span></div>
<div class="line"><a id="l00817" name="l00817"></a><span class="lineno">  817</span><span class="comment">   * close_connection_immediately()); then we lock sock and remove sock from</span></div>
<div class="line"><a id="l00818" name="l00818"></a><span class="lineno">  818</span><span class="comment">   * serv-&gt;m_unaccepted_socks.  Is this OK?  Well, it is not different from this situation: they</span></div>
<div class="line"><a id="l00819" name="l00819"></a><span class="lineno">  819</span><span class="comment">   * accept()ed, and then quickly there was an error on the resulting socket, so we closed it</span></div>
<div class="line"><a id="l00820" name="l00820"></a><span class="lineno">  820</span><span class="comment">   * before any data came in.  Therefore, yes, this is also OK. */</span></div>
<div class="line"><a id="l00821" name="l00821"></a><span class="lineno">  821</span>} <span class="comment">// Node::serv_peer_socket_closed()</span></div>
<div class="line"><a id="l00822" name="l00822"></a><span class="lineno">  822</span> </div>
<div class="line"><a id="l00823" name="l00823"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Node.html#abf0204e999b5dc28ee9b5db6eae9aa1a">  823</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#abf0204e999b5dc28ee9b5db6eae9aa1a">Node::serv_peer_socket_acceptable</a>(<a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Server_socket::Ptr</a> serv, <a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Peer_socket::Ptr</a> sock)</div>
<div class="line"><a id="l00824" name="l00824"></a><span class="lineno">  824</span>{</div>
<div class="line"><a id="l00825" name="l00825"></a><span class="lineno">  825</span>  <span class="comment">// We are in thread W.</span></div>
<div class="line"><a id="l00826" name="l00826"></a><span class="lineno">  826</span> </div>
<div class="line"><a id="l00827" name="l00827"></a><span class="lineno">  827</span>  {</div>
<div class="line"><a id="l00828" name="l00828"></a><span class="lineno">  828</span>    <a class="code hl_typedef" href="classflow_1_1net__flow_1_1Server__socket.html#ad428b65f60ee317aff7a0ad7f7a8f56d">Server_socket::Lock_guard</a> lock(serv-&gt;m_mutex);</div>
<div class="line"><a id="l00829" name="l00829"></a><span class="lineno">  829</span>    serv-&gt;m_unaccepted_socks.insert(sock); <span class="comment">// Remember that Linked_hash_set&lt;&gt; insert()s at the *front*.</span></div>
<div class="line"><a id="l00830" name="l00830"></a><span class="lineno">  830</span>  }</div>
<div class="line"><a id="l00831" name="l00831"></a><span class="lineno">  831</span>  <span class="comment">// This guy is only to be accessed from thread W (which we&#39;re in), so no lock needed.</span></div>
<div class="line"><a id="l00832" name="l00832"></a><span class="lineno">  832</span>  serv-&gt;m_connecting_socks.erase(sock);</div>
<div class="line"><a id="l00833" name="l00833"></a><span class="lineno">  833</span>}</div>
<div class="line"><a id="l00834" name="l00834"></a><span class="lineno">  834</span> </div>
<div class="line"><a id="l00835" name="l00835"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Node.html#a0379c897bdb3e4eddeb759547be78261">  835</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#a0379c897bdb3e4eddeb759547be78261">Node::serv_peer_socket_init</a>(<a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Server_socket::Ptr</a> serv, <a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Peer_socket::Ptr</a> sock)</div>
<div class="line"><a id="l00836" name="l00836"></a><span class="lineno">  836</span>{</div>
<div class="line"><a id="l00837" name="l00837"></a><span class="lineno">  837</span>  <span class="comment">// We are in thread W.</span></div>
<div class="line"><a id="l00838" name="l00838"></a><span class="lineno">  838</span> </div>
<div class="line"><a id="l00839" name="l00839"></a><span class="lineno">  839</span>  <span class="comment">/* Add this connecting socket to the pool of such connecting sockets maintained by the</span></div>
<div class="line"><a id="l00840" name="l00840"></a><span class="lineno">  840</span><span class="comment">   * Server_socket.  Once it is fully established, it will move from here to the queue</span></div>
<div class="line"><a id="l00841" name="l00841"></a><span class="lineno">  841</span><span class="comment">   * serv-&gt;m_unaccepted_socks, where users can claim it via accept().  The utility of serv-&gt;m_unaccepted_socks</span></div>
<div class="line"><a id="l00842" name="l00842"></a><span class="lineno">  842</span><span class="comment">   * is obvious, but why keep serv-&gt;m_connecting_socks?  After all we&#39;ve already added sock to m_socks, so</span></div>
<div class="line"><a id="l00843" name="l00843"></a><span class="lineno">  843</span><span class="comment">   * demultiplexing of those messages (like SYN_ACK_ACK) will work without any additional structure.</span></div>
<div class="line"><a id="l00844" name="l00844"></a><span class="lineno">  844</span><span class="comment">   * Answer: we need serv-&gt;m_connecting_socks at least for the case where we or the user close the</span></div>
<div class="line"><a id="l00845" name="l00845"></a><span class="lineno">  845</span><span class="comment">   * listening socket (serv).  In this case all pending connections must be aborted via RST (to let</span></div>
<div class="line"><a id="l00846" name="l00846"></a><span class="lineno">  846</span><span class="comment">   * the other side know), and we&#39;d know which ones to contact via serv-&gt;m_connecting_socks.</span></div>
<div class="line"><a id="l00847" name="l00847"></a><span class="lineno">  847</span><span class="comment">   * The disallowing of accept()s after the associated listen() has been canceled is discussed in</span></div>
<div class="line"><a id="l00848" name="l00848"></a><span class="lineno">  848</span><span class="comment">   * Server_socket documentation, but in short that behavior is similar to the BSD sockets</span></div>
<div class="line"><a id="l00849" name="l00849"></a><span class="lineno">  849</span><span class="comment">   * behavior. */</span></div>
<div class="line"><a id="l00850" name="l00850"></a><span class="lineno">  850</span>  serv-&gt;m_connecting_socks.insert(sock);</div>
<div class="line"><a id="l00851" name="l00851"></a><span class="lineno">  851</span> </div>
<div class="line"><a id="l00852" name="l00852"></a><span class="lineno">  852</span>  <span class="comment">// And vice versa: maintain the invariant.</span></div>
<div class="line"><a id="l00853" name="l00853"></a><span class="lineno">  853</span>  sock-&gt;m_originating_serv = serv;</div>
<div class="line"><a id="l00854" name="l00854"></a><span class="lineno">  854</span> </div>
<div class="line"><a id="l00855" name="l00855"></a><span class="lineno">  855</span>  <span class="comment">// We didn&#39;t lock, because socket not yet available via accept(), so not accessed from non-W threads.</span></div>
<div class="line"><a id="l00856" name="l00856"></a><span class="lineno">  856</span>} <span class="comment">// Node::serv_peer_socket_init()</span></div>
<div class="line"><a id="l00857" name="l00857"></a><span class="lineno">  857</span> </div>
<div class="line"><a id="l00858" name="l00858"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Node.html#a0a91542fce634cf6a749c71f225b105a">  858</a></span><a class="code hl_class" href="classflow_1_1net__flow_1_1Server__socket.html">Server_socket</a>* <a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#a0a91542fce634cf6a749c71f225b105a">Node::serv_create</a>(<span class="keyword">const</span> <a class="code hl_struct" href="structflow_1_1net__flow_1_1Peer__socket__options.html">Peer_socket_options</a>* child_sock_opts) <span class="comment">// Virtual.</span></div>
<div class="line"><a id="l00859" name="l00859"></a><span class="lineno">  859</span>{</div>
<div class="line"><a id="l00860" name="l00860"></a><span class="lineno">  860</span>  <span class="comment">// Just make a regular net_flow::Server_socket.</span></div>
<div class="line"><a id="l00861" name="l00861"></a><span class="lineno">  861</span>  <span class="keywordflow">return</span> serv_create_forward_plus_ctor_args&lt;Server_socket&gt;(child_sock_opts);</div>
<div class="line"><a id="l00862" name="l00862"></a><span class="lineno">  862</span>}</div>
<div class="line"><a id="l00863" name="l00863"></a><span class="lineno">  863</span> </div>
<div class="line"><a id="l00864" name="l00864"></a><span class="lineno">  864</span><span class="comment">// Free implementations.</span></div>
<div class="line"><a id="l00865" name="l00865"></a><span class="lineno">  865</span> </div>
<div class="line"><a id="l00866" name="l00866"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Server__socket.html#acbbe4fae58626a54fabdcd4bcdfdb011">  866</a></span>std::ostream&amp; <a class="code hl_function" href="namespaceflow_1_1net__flow.html#ab9f537c84f77e9b8fa742fc5dc6d5693">operator&lt;&lt;</a>(std::ostream&amp; os, <span class="keyword">const</span> <a class="code hl_class" href="classflow_1_1net__flow_1_1Server__socket.html">Server_socket</a>* serv)</div>
<div class="line"><a id="l00867" name="l00867"></a><span class="lineno">  867</span>{</div>
<div class="line"><a id="l00868" name="l00868"></a><span class="lineno">  868</span>  <span class="keywordflow">return</span></div>
<div class="line"><a id="l00869" name="l00869"></a><span class="lineno">  869</span>    serv</div>
<div class="line"><a id="l00870" name="l00870"></a><span class="lineno">  870</span>      ? (os</div>
<div class="line"><a id="l00871" name="l00871"></a><span class="lineno">  871</span>         &lt;&lt; <span class="stringliteral">&quot;NetFlow_server [NetFlow [:&quot;</span> &lt;&lt; serv-&gt;<a class="code hl_function" href="classflow_1_1net__flow_1_1Server__socket.html#acd7b6b9c66eee2f3bbf35ac1068b1cb1">local_port</a>() &lt;&lt; <span class="stringliteral">&quot;]] @&quot;</span> &lt;&lt; <span class="keyword">static_cast&lt;</span><span class="keyword">const </span><span class="keywordtype">void</span>*<span class="keyword">&gt;</span>(serv))</div>
<div class="line"><a id="l00872" name="l00872"></a><span class="lineno">  872</span>      : (os &lt;&lt; <span class="stringliteral">&quot;NetFlow_server@null&quot;</span>);</div>
<div class="line"><a id="l00873" name="l00873"></a><span class="lineno">  873</span>}</div>
<div class="line"><a id="l00874" name="l00874"></a><span class="lineno">  874</span><span class="comment"></span> </div>
<div class="line"><a id="l00875" name="l00875"></a><span class="lineno">  875</span><span class="comment">/// @cond</span></div>
<div class="line"><a id="l00876" name="l00876"></a><span class="lineno">  876</span><span class="comment"></span><span class="comment">/* -^- Doxygen, please ignore the following.  (Don&#39;t want docs generated for temp macro; this is more maintainable</span></div>
<div class="line"><a id="l00877" name="l00877"></a><span class="lineno">  877</span><span class="comment"> * than specifying the macro name to omit it, in Doxygen-config EXCLUDE_SYMBOLS.) */</span></div>
<div class="line"><a id="l00878" name="l00878"></a><span class="lineno">  878</span> </div>
<div class="line"><a id="l00879" name="l00879"></a><span class="lineno">  879</span><span class="comment">// That&#39;s right, I did this.  Wanna fight about it?</span></div>
<div class="line"><a id="l00880" name="l00880"></a><span class="lineno">  880</span><span class="preprocessor">#define STATE_TO_CASE_STATEMENT(ARG_state) \</span></div>
<div class="line"><a id="l00881" name="l00881"></a><span class="lineno">  881</span><span class="preprocessor">  case Server_socket::State::S_##ARG_state: \</span></div>
<div class="line"><a id="l00882" name="l00882"></a><span class="lineno">  882</span><span class="preprocessor">    return os &lt;&lt; #ARG_state</span></div>
<div class="line"><a id="l00883" name="l00883"></a><span class="lineno">  883</span> </div>
<div class="line"><a id="l00884" name="l00884"></a><span class="lineno">  884</span><span class="comment">// -v- Doxygen, please stop ignoring.</span><span class="comment"></span></div>
<div class="line"><a id="l00885" name="l00885"></a><span class="lineno">  885</span><span class="comment">/// @endcond</span></div>
<div class="line"><a id="l00886" name="l00886"></a><span class="lineno">  886</span><span class="comment"></span> </div>
<div class="line"><a id="l00887" name="l00887"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Server__socket.html#a48bc8803c67e75b955a1f2778a8ad2bf">  887</a></span>std::ostream&amp; <a class="code hl_function" href="namespaceflow_1_1net__flow.html#ab9f537c84f77e9b8fa742fc5dc6d5693">operator&lt;&lt;</a>(std::ostream&amp; os, <a class="code hl_enumeration" href="classflow_1_1net__flow_1_1Server__socket.html#a8bc789b851677a47d7c0a1aa0c69a997">Server_socket::State</a> state)</div>
<div class="line"><a id="l00888" name="l00888"></a><span class="lineno">  888</span>{</div>
<div class="line"><a id="l00889" name="l00889"></a><span class="lineno">  889</span>  <span class="keywordflow">switch</span> (state)</div>
<div class="line"><a id="l00890" name="l00890"></a><span class="lineno">  890</span>  {</div>
<div class="line"><a id="l00891" name="l00891"></a><span class="lineno">  891</span>    STATE_TO_CASE_STATEMENT(LISTENING);</div>
<div class="line"><a id="l00892" name="l00892"></a><span class="lineno">  892</span>    STATE_TO_CASE_STATEMENT(CLOSING);</div>
<div class="line"><a id="l00893" name="l00893"></a><span class="lineno">  893</span>    STATE_TO_CASE_STATEMENT(CLOSED);</div>
<div class="line"><a id="l00894" name="l00894"></a><span class="lineno">  894</span>  }</div>
<div class="line"><a id="l00895" name="l00895"></a><span class="lineno">  895</span>  <span class="keywordflow">return</span> os;</div>
<div class="line"><a id="l00896" name="l00896"></a><span class="lineno">  896</span><span class="preprocessor">#undef STATE_TO_CASE_STATEMENT</span></div>
<div class="line"><a id="l00897" name="l00897"></a><span class="lineno">  897</span>}</div>
<div class="line"><a id="l00898" name="l00898"></a><span class="lineno">  898</span> </div>
<div class="line"><a id="l00899" name="l00899"></a><span class="lineno">  899</span>} <span class="comment">// namespace flow::net_flow</span></div>
<div class="ttc" id="aasync_2util_8hpp_html"><div class="ttname"><a href="async_2util_8hpp.html">util.hpp</a></div></div>
<div class="ttc" id="abandwidth_8hpp_html"><div class="ttname"><a href="bandwidth_8hpp.html">bandwidth.hpp</a></div></div>
<div class="ttc" id="aclassflow_1_1Function_html"><div class="ttname"><a href="classflow_1_1Function.html">flow::Function</a></div><div class="ttdef"><b>Definition:</b> <a href="common_8hpp_source.html#l00512">common.hpp:512</a></div></div>
<div class="ttc" id="aclassflow_1_1log_1_1Log__context_html_a8a5fef42dc2cedf3c0d1a6e83beb2948"><div class="ttname"><a href="classflow_1_1log_1_1Log__context.html#a8a5fef42dc2cedf3c0d1a6e83beb2948">flow::log::Log_context::get_log_component</a></div><div class="ttdeci">const Component &amp; get_log_component() const</div><div class="ttdoc">Returns reference to the stored Component object, particularly as many FLOW_LOG_*() macros expect.</div><div class="ttdef"><b>Definition:</b> <a href="log_8cpp_source.html#l00222">log.cpp:222</a></div></div>
<div class="ttc" id="aclassflow_1_1log_1_1Log__context_html_af4db395042b065b00398cd59845dcb4d"><div class="ttname"><a href="classflow_1_1log_1_1Log__context.html#af4db395042b065b00398cd59845dcb4d">flow::log::Log_context::get_logger</a></div><div class="ttdeci">Logger * get_logger() const</div><div class="ttdoc">Returns the stored Logger pointer, particularly as many FLOW_LOG_*() macros expect.</div><div class="ttdef"><b>Definition:</b> <a href="log_8cpp_source.html#l00217">log.cpp:217</a></div></div>
<div class="ttc" id="aclassflow_1_1log_1_1Logger_html"><div class="ttname"><a href="classflow_1_1log_1_1Logger.html">flow::log::Logger</a></div><div class="ttdoc">Interface that the user should implement, passing the implementing Logger into logging classes (Flow'...</div><div class="ttdef"><b>Definition:</b> <a href="log_8hpp_source.html#l01280">log.hpp:1284</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Congestion__control__selector_html_a52eee18d41c3f9cc7d6c48b766a7919f"><div class="ttname"><a href="classflow_1_1net__flow_1_1Congestion__control__selector.html#a52eee18d41c3f9cc7d6c48b766a7919f">flow::net_flow::Congestion_control_selector::create_strategy</a></div><div class="ttdeci">static Congestion_control_strategy * create_strategy(Strategy_choice strategy_choice, log::Logger *logger_ptr, Peer_socket::Const_ptr sock)</div><div class="ttdoc">Factory method that, given an enum identifying the desired strategy, allocates the appropriate Conges...</div><div class="ttdef"><b>Definition:</b> <a href="cong__ctl_8cpp_source.html#l00100">cong_ctl.cpp:101</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Event__set_html_a19cc3a286c8a11c986d2a59ec1e39a71afb218b0110d3f9f26ee089bad2e0eba2"><div class="ttname"><a href="classflow_1_1net__flow_1_1Event__set.html#a19cc3a286c8a11c986d2a59ec1e39a71afb218b0110d3f9f26ee089bad2e0eba2">flow::net_flow::Event_set::Event_type::S_SERVER_SOCKET_ACCEPTABLE</a></div><div class="ttdeci">@ S_SERVER_SOCKET_ACCEPTABLE</div><div class="ttdoc">Event type specifying the condition of interest wherein a target Server_socket serv is such that call...</div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html">flow::net_flow::Node</a></div><div class="ttdoc">An object of this class is a single Flow-protocol networking node, in the sense that: (1) it has a di...</div><div class="ttdef"><b>Definition:</b> <a href="node_8hpp_source.html#l00930">node.hpp:934</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_a0379c897bdb3e4eddeb759547be78261"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#a0379c897bdb3e4eddeb759547be78261">flow::net_flow::Node::serv_peer_socket_init</a></div><div class="ttdeci">void serv_peer_socket_init(Server_socket::Ptr serv, Peer_socket::Ptr sock)</div><div class="ttdoc">Records a new (just received SYN) peer socket from the given server socket.</div><div class="ttdef"><b>Definition:</b> <a href="server__socket_8cpp_source.html#l00835">server_socket.cpp:835</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_a06e4cea2eefa1b06975864f09740c96b"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#a06e4cea2eefa1b06975864f09740c96b">flow::net_flow::Node::handle_data_to_established</a></div><div class="ttdeci">void handle_data_to_established(const Socket_id &amp;socket_id, Peer_socket::Ptr sock, boost::shared_ptr&lt; Data_packet &gt; packet, bool syn_rcvd_qd_packet)</div><div class="ttdoc">Handles a just-deserialized, just-demultiplexed, low-level DATA packet delivered to the given peer so...</div><div class="ttdef"><b>Definition:</b> <a href="peer__socket_8cpp_source.html#l00545">peer_socket.cpp:545</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_a0a91542fce634cf6a749c71f225b105a"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#a0a91542fce634cf6a749c71f225b105a">flow::net_flow::Node::serv_create</a></div><div class="ttdeci">virtual Server_socket * serv_create(const Peer_socket_options *child_sock_opts)</div><div class="ttdoc">Internal factory used for ALL Server_socket objects created by this Node (including subclasses).</div><div class="ttdef"><b>Definition:</b> <a href="server__socket_8cpp_source.html#l00858">server_socket.cpp:858</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_a0bac29a091e1026e5b4f0b5d84a710c7"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#a0bac29a091e1026e5b4f0b5d84a710c7">flow::net_flow::Node::serv_set_state</a></div><div class="ttdeci">void serv_set_state(Server_socket::Ptr serv, Server_socket::State state)</div><div class="ttdoc">Sets Server_socket::m_state.</div><div class="ttdef"><b>Definition:</b> <a href="server__socket_8cpp_source.html#l00411">server_socket.cpp:411</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_a109a118ca312e94686595ea08dac7ad0"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#a109a118ca312e94686595ea08dac7ad0">flow::net_flow::Node::ensure_sock_open</a></div><div class="ttdeci">static bool ensure_sock_open(Socket_ptr sock, Error_code *err_code)</div><div class="ttdoc">Helper method that checks whether the given Peer_socket or Server_socket is CLOSED; if so,...</div><div class="ttdef"><b>Definition:</b> <a href="node_8hpp_source.html#l04099">node.hpp:4099</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_a29d02f9e302c7b06288ff1c644fa8d65"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#a29d02f9e302c7b06288ff1c644fa8d65">flow::net_flow::Node::handle_syn_ack_ack_to_syn_rcvd</a></div><div class="ttdeci">void handle_syn_ack_ack_to_syn_rcvd(const Socket_id &amp;socket_id, Peer_socket::Ptr sock, boost::shared_ptr&lt; const Syn_ack_ack_packet &gt; syn_ack_ack)</div><div class="ttdoc">Handles a just-deserialized, just-demultiplexed low-level SYN_ACK_ACK packet delivered to the given p...</div><div class="ttdef"><b>Definition:</b> <a href="server__socket_8cpp_source.html#l00568">server_socket.cpp:568</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_a2a4dc3d8e294bbc8423e111f52e414ae"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#a2a4dc3d8e294bbc8423e111f52e414ae">flow::net_flow::Node::sync_op</a></div><div class="ttdeci">Non_blocking_func_ret_type sync_op(typename Socket::Ptr sock, const Function&lt; Non_blocking_func_ret_type()&gt; &amp;non_blocking_func, Non_blocking_func_ret_type would_block_ret_val, Event_set::Event_type ev_type, const Fine_time_pt &amp;wait_until, Error_code *err_code)</div><div class="ttdoc">Implementation of core blocking transfer methods, namely Peer_socket::sync_send(),...</div><div class="ttdef"><b>Definition:</b> <a href="node_8hpp_source.html#l03935">node.hpp:3935</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_a2af9ec4f1483cd9a2183286f7dfa9c87"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#a2af9ec4f1483cd9a2183286f7dfa9c87">flow::net_flow::Node::serv_close_detected</a></div><div class="ttdeci">void serv_close_detected(Server_socket::Ptr serv, const Error_code &amp;disconnect_cause, bool close)</div><div class="ttdoc">Records that thread W shows this socket is not to listen to incoming connections and is to abort any ...</div><div class="ttdef"><b>Definition:</b> <a href="server__socket_8cpp_source.html#l00751">server_socket.cpp:751</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_a3c2cd6a6c328a2d5381308258d35d95d"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#a3c2cd6a6c328a2d5381308258d35d95d">flow::net_flow::Node::listen</a></div><div class="ttdeci">Server_socket::Ptr listen(flow_port_t local_port, Error_code *err_code=0, const Peer_socket_options *child_sock_opts=0)</div><div class="ttdoc">Sets up a server on the given local Flow port and returns Server_socket which can be used to accept s...</div><div class="ttdef"><b>Definition:</b> <a href="server__socket_8cpp_source.html#l00141">server_socket.cpp:141</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_a3f9cf4d7160b3e27b3b0131fc4507ce7"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#a3f9cf4d7160b3e27b3b0131fc4507ce7">flow::net_flow::Node::cancel_timers</a></div><div class="ttdeci">void cancel_timers(Peer_socket::Ptr sock)</div><div class="ttdoc">Cancel any timers and scheduled tasks active in the given socket.</div><div class="ttdef"><b>Definition:</b> <a href="peer__socket_8cpp_source.html#l04376">peer_socket.cpp:4376</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_a446ee7115c70cbcd48e3897d32fc0276"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#a446ee7115c70cbcd48e3897d32fc0276">flow::net_flow::Node::sock_validate_options</a></div><div class="ttdeci">bool sock_validate_options(const Peer_socket_options &amp;opts, const Peer_socket_options *prev_opts, Error_code *err_code) const</div><div class="ttdoc">Analogous to validate_options() but checks per-socket options instead of per-Node options.</div><div class="ttdef"><b>Definition:</b> <a href="peer__socket_8cpp_source.html#l06144">peer_socket.cpp:6144</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_a449ef757abee4c5d12f8fc62a5ca66b4"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#a449ef757abee4c5d12f8fc62a5ca66b4">flow::net_flow::Node::m_opts_mutex</a></div><div class="ttdeci">Options_mutex m_opts_mutex</div><div class="ttdoc">The mutex protecting m_opts.</div><div class="ttdef"><b>Definition:</b> <a href="node_8hpp_source.html#l03665">node.hpp:3665</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_a51b26bff4cdf545f22d8edec7185c5c4"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#a51b26bff4cdf545f22d8edec7185c5c4">flow::net_flow::Node::serv_is_acceptable</a></div><div class="ttdeci">bool serv_is_acceptable(const boost::any &amp;serv_as_any) const</div><div class="ttdoc">Returns true if and only if calling serv-&gt;accept() with at least some arguments would return either n...</div><div class="ttdef"><b>Definition:</b> <a href="server__socket_8cpp_source.html#l00339">server_socket.cpp:339</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_a6bcd840049c57150cdaa5c59d22c488b"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#a6bcd840049c57150cdaa5c59d22c488b">flow::net_flow::Node::create_syn_ack</a></div><div class="ttdeci">Syn_ack_packet::Ptr create_syn_ack(Peer_socket::Const_ptr sock)</div><div class="ttdoc">Like create_syn() but for SYN_ACK.</div><div class="ttdef"><b>Definition:</b> <a href="peer__socket_8cpp_source.html#l05743">peer_socket.cpp:5743</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_a6daaa6a5a7d0b7e5a2266dd9db400c01"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#a6daaa6a5a7d0b7e5a2266dd9db400c01">flow::net_flow::Node::sock_create</a></div><div class="ttdeci">virtual Peer_socket * sock_create(const Peer_socket_options &amp;opts)</div><div class="ttdoc">Internal factory used for ALL Peer_socket objects created by this Node (including subclasses).</div><div class="ttdef"><b>Definition:</b> <a href="peer__socket_8cpp_source.html#l06405">peer_socket.cpp:6405</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_a74a6a82a1390a76e985593969fb47184"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#a74a6a82a1390a76e985593969fb47184">flow::net_flow::Node::async_no_sock_low_lvl_rst_send</a></div><div class="ttdeci">void async_no_sock_low_lvl_rst_send(Low_lvl_packet::Const_ptr causing_packet, const util::Udp_endpoint &amp;low_lvl_remote_endpoint)</div><div class="ttdoc">Sends an RST to the given UDP endpoint in response to the given incoming low-level packet that came f...</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__io_8cpp_source.html#l00580">low_lvl_io.cpp:580</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_a8938c4a091edf1c1c77e2cc8f505f0ff"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#a8938c4a091edf1c1c77e2cc8f505f0ff">flow::net_flow::Node::m_seq_num_generator</a></div><div class="ttdeci">Sequence_number::Generator m_seq_num_generator</div><div class="ttdoc">Sequence number generator (at least to generate ISNs). Only thread W can access this.</div><div class="ttdef"><b>Definition:</b> <a href="node_8hpp_source.html#l03738">node.hpp:3738</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_a8a4ddf81ddbeab1f740940c4cc0d3625"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#a8a4ddf81ddbeab1f740940c4cc0d3625">flow::net_flow::Node::event_set_all_check_delta</a></div><div class="ttdeci">void event_set_all_check_delta(bool defer_delta_check)</div><div class="ttdoc">For each WAITING Event_set within the Node: checks for any events that hold, and if any do hold,...</div><div class="ttdef"><b>Definition:</b> <a href="event__set_8cpp_source.html#l01127">event_set.cpp:1127</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_a8a6c02bf520a16df4028bd3c88732a8d"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#a8a6c02bf520a16df4028bd3c88732a8d">flow::net_flow::Node::serv_peer_socket_closed</a></div><div class="ttdeci">void serv_peer_socket_closed(Server_socket::Ptr serv, Peer_socket::Ptr sock)</div><div class="ttdoc">Records that a Server_socket-contained (i.e., currently un-established, or established but not yet ac...</div><div class="ttdef"><b>Definition:</b> <a href="server__socket_8cpp_source.html#l00771">server_socket.cpp:771</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_a90244d69d550370158bbe843ab595a7a"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#a90244d69d550370158bbe843ab595a7a">flow::net_flow::Node::m_socks</a></div><div class="ttdeci">Socket_id_to_socket_map m_socks</div><div class="ttdoc">The peer-to-peer connections this Node is currently tracking.</div><div class="ttdef"><b>Definition:</b> <a href="node_8hpp_source.html#l03750">node.hpp:3750</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_a97c8679c70ac9c7dda394fdf335aaed7"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#a97c8679c70ac9c7dda394fdf335aaed7">flow::net_flow::Node::Options_lock</a></div><div class="ttdeci">Peer_socket::Options_lock Options_lock</div><div class="ttdoc">Short-hand for lock that acquires exclusive access to an Options_mutex.</div><div class="ttdef"><b>Definition:</b> <a href="node_8hpp_source.html#l01436">node.hpp:1436</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_a99836ffb51eaefa4d2cc21770461cd97"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#a99836ffb51eaefa4d2cc21770461cd97">flow::net_flow::Node::socket_id</a></div><div class="ttdeci">static Socket_id socket_id(Peer_socket::Const_ptr sock)</div><div class="ttdoc">Constructs the socket pair (connection ID) for the given socket.</div><div class="ttdef"><b>Definition:</b> <a href="peer__socket_8cpp_source.html#l05973">peer_socket.cpp:5973</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_aa1d9656e9e1480021c87530ec6dbebbe"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#aa1d9656e9e1480021c87530ec6dbebbe">flow::net_flow::Node::sock_set_int_state</a></div><div class="ttdeci">void sock_set_int_state(Peer_socket::Ptr sock, Peer_socket::Int_state new_state)</div><div class="ttdoc">Sets internal state of given socket to the given state and logs a TRACE message about it.</div><div class="ttdef"><b>Definition:</b> <a href="peer__socket_8cpp_source.html#l06008">peer_socket.cpp:6008</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_aaaf5c3b5e6b9f9f1658b60907b36a498"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#aaaf5c3b5e6b9f9f1658b60907b36a498">flow::net_flow::Node::handle_syn_to_listening_server</a></div><div class="ttdeci">Peer_socket::Ptr handle_syn_to_listening_server(Server_socket::Ptr serv, boost::shared_ptr&lt; const Syn_packet &gt; syn, const util::Udp_endpoint &amp;low_lvl_remote_endpoint)</div><div class="ttdoc">Handles a just-deserialized, just-demultiplexed low-level SYN packet delivered to the given server so...</div><div class="ttdef"><b>Definition:</b> <a href="server__socket_8cpp_source.html#l00430">server_socket.cpp:430</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_aae148cec361b59237996a4b30c6624b5"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#aae148cec361b59237996a4b30c6624b5">flow::net_flow::Node::running</a></div><div class="ttdeci">bool running() const</div><div class="ttdoc">Returns true if and only if the Node is operating.</div><div class="ttdef"><b>Definition:</b> <a href="node_8cpp_source.html#l00420">node.cpp:420</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_aae28990628a86a07327f49973f2390df"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#aae28990628a86a07327f49973f2390df">flow::net_flow::Node::m_servs</a></div><div class="ttdeci">Port_to_server_map m_servs</div><div class="ttdoc">The server sockets this Node is currently tracking.</div><div class="ttdef"><b>Definition:</b> <a href="node_8hpp_source.html#l03756">node.hpp:3756</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_ab0026feecdb74eda904d00d2c7016bab"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#ab0026feecdb74eda904d00d2c7016bab">flow::net_flow::Node::m_sock_events</a></div><div class="ttdeci">Event_set::Ev_type_to_socks_map m_sock_events</div><div class="ttdoc">All sockets that have been detected to be &quot;ready&quot; (by the Event_set doc header definition) at any poi...</div><div class="ttdef"><b>Definition:</b> <a href="node_8hpp_source.html#l03788">node.hpp:3788</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_ab427ebc124a6233ae48a7562662a6e81"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#ab427ebc124a6233ae48a7562662a6e81">flow::net_flow::Node::setup_drop_timer</a></div><div class="ttdeci">void setup_drop_timer(const Socket_id &amp;socket_id, Peer_socket::Ptr sock)</div><div class="ttdoc">Creates a new Drop Timer and saves it to sock-&gt;m_snd_drop_timer.</div><div class="ttdef"><b>Definition:</b> <a href="peer__socket_8cpp_source.html#l04427">peer_socket.cpp:4427</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_aba411df8746d5fd4db2d28df3a016f5e"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#aba411df8746d5fd4db2d28df3a016f5e">flow::net_flow::Node::listen_worker</a></div><div class="ttdeci">void listen_worker(flow_port_t local_port, const Peer_socket_options *child_sock_opts, Server_socket::Ptr *serv)</div><div class="ttdoc">Thread W implementation of listen().</div><div class="ttdef"><b>Definition:</b> <a href="server__socket_8cpp_source.html#l00215">server_socket.cpp:215</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_abf0204e999b5dc28ee9b5db6eae9aa1a"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#abf0204e999b5dc28ee9b5db6eae9aa1a">flow::net_flow::Node::serv_peer_socket_acceptable</a></div><div class="ttdeci">void serv_peer_socket_acceptable(Server_socket::Ptr serv, Peer_socket::Ptr sock)</div><div class="ttdoc">Records that an unestablished socket sock (Peer_socket::Int_state::S_SYN_RCVD) has just become establ...</div><div class="ttdef"><b>Definition:</b> <a href="server__socket_8cpp_source.html#l00823">server_socket.cpp:823</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_abf80b7de1398e93d1d4289ef5bf2ae2c"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#abf80b7de1398e93d1d4289ef5bf2ae2c">flow::net_flow::Node::handle_data_to_syn_rcvd</a></div><div class="ttdeci">void handle_data_to_syn_rcvd(Peer_socket::Ptr sock, boost::shared_ptr&lt; Data_packet &gt; packet)</div><div class="ttdoc">Handles a just-deserialized, just-demultiplexed, low-level DATA packet delivered to the given peer so...</div><div class="ttdef"><b>Definition:</b> <a href="server__socket_8cpp_source.html#l00686">server_socket.cpp:686</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_ac1485c07049d4bee70ad4ef2fc07bf12"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#ac1485c07049d4bee70ad4ef2fc07bf12">flow::net_flow::Node::setup_connection_timers</a></div><div class="ttdeci">void setup_connection_timers(const Socket_id &amp;socket_id, Peer_socket::Ptr sock, bool initial)</div><div class="ttdoc">Assuming we've just sent SYN or SYN_ACK, sets up an asynchronous scheduled task to fire within some a...</div><div class="ttdef"><b>Definition:</b> <a href="peer__socket_8cpp_source.html#l04257">peer_socket.cpp:4257</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_ac397d3fd163f1456b7bb370a3cff951c"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#ac397d3fd163f1456b7bb370a3cff951c">flow::net_flow::Node::sock_rcv_wnd</a></div><div class="ttdeci">size_t sock_rcv_wnd(Peer_socket::Const_ptr sock) const</div><div class="ttdoc">Computes and returns the currently correct rcv_wnd value; that is the amount of space free in Receive...</div><div class="ttdef"><b>Definition:</b> <a href="peer__socket_8cpp_source.html#l05435">peer_socket.cpp:5435</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_ac3c67514c259404de3f27a8cae8b0567"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#ac3c67514c259404de3f27a8cae8b0567">flow::net_flow::Node::accept</a></div><div class="ttdeci">Peer_socket::Ptr accept(Server_socket::Ptr serv, Error_code *err_code)</div><div class="ttdoc">Implementation of non-blocking serv-&gt;accept() for server socket serv in all cases except when serv-&gt;s...</div><div class="ttdef"><b>Definition:</b> <a href="server__socket_8cpp_source.html#l00297">server_socket.cpp:297</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_ad502e0a992a79b71af42a9cdc20a4280"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#ad502e0a992a79b71af42a9cdc20a4280">flow::net_flow::Node::sock_set_state</a></div><div class="ttdeci">void sock_set_state(Peer_socket::Ptr sock, Peer_socket::State state, Peer_socket::Open_sub_state open_sub_state=Peer_socket::Open_sub_state::S_CONNECTED)</div><div class="ttdoc">Sets Peer_socket::m_state and Peer_socket::m_open_sub_state.</div><div class="ttdef"><b>Definition:</b> <a href="peer__socket_8cpp_source.html#l06017">peer_socket.cpp:6017</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_ade08f0457943f803c23b55649139c0d3"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#ade08f0457943f803c23b55649139c0d3">flow::net_flow::Node::m_opts</a></div><div class="ttdeci">Node_options m_opts</div><div class="ttdoc">This Node's global set of options.</div><div class="ttdef"><b>Definition:</b> <a href="node_8hpp_source.html#l03662">node.hpp:3662</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_adf6d71af81def2d030f0fef159c1b06d"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#adf6d71af81def2d030f0fef159c1b06d">flow::net_flow::Node::close_empty_server_immediately</a></div><div class="ttdeci">void close_empty_server_immediately(const flow_port_t local_port, Server_socket::Ptr serv, const Error_code &amp;err_code, bool defer_delta_check)</div><div class="ttdoc">Handles the transition of the given server socket from S_LISTENING/S_CLOSING to S_CLOSED (including e...</div><div class="ttdef"><b>Definition:</b> <a href="server__socket_8cpp_source.html#l00361">server_socket.cpp:361</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_ae536f016607677a945ad42034a21e82a"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#ae536f016607677a945ad42034a21e82a">flow::net_flow::Node::m_rnd_security_tokens</a></div><div class="ttdeci">util::Rnd_gen_uniform_range&lt; Peer_socket::security_token_t &gt; m_rnd_security_tokens</div><div class="ttdoc">Random number generator for picking security tokens; seeded on time at Node construction and generate...</div><div class="ttdef"><b>Definition:</b> <a href="node_8hpp_source.html#l03744">node.hpp:3744</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_af1c4623729d0a061200a386f7a651926"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#af1c4623729d0a061200a386f7a651926">flow::net_flow::Node::async_sock_low_lvl_packet_send_paced</a></div><div class="ttdeci">void async_sock_low_lvl_packet_send_paced(const Peer_socket::Ptr &amp;sock, Low_lvl_packet::Ptr &amp;&amp;packet)</div><div class="ttdoc">Begins the process of asynchronously sending the given low-level packet to the remote Node specified ...</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__io_8cpp_source.html#l00599">low_lvl_io.cpp:599</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_af5597a417d03e2bed87cd772ef5cef29"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#af5597a417d03e2bed87cd772ef5cef29">flow::net_flow::Node::m_task_engine</a></div><div class="ttdeci">util::Task_engine m_task_engine</div><div class="ttdoc">The main loop engine, functioning in the single-threaded-but-asynchronous callback-based &quot;reactor&quot; st...</div><div class="ttdef"><b>Definition:</b> <a href="node_8hpp_source.html#l03697">node.hpp:3697</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_afd6388a362531ada956a864fefff6011"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#afd6388a362531ada956a864fefff6011">flow::net_flow::Node::m_ports</a></div><div class="ttdeci">Port_space m_ports</div><div class="ttdoc">Flow port space for both client and server sockets. All threads may access this.</div><div class="ttdef"><b>Definition:</b> <a href="node_8hpp_source.html#l03735">node.hpp:3735</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_afe70a0c32695e417e7a09e0ba773f151"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#afe70a0c32695e417e7a09e0ba773f151">flow::net_flow::Node::rst_and_close_connection_immediately</a></div><div class="ttdeci">void rst_and_close_connection_immediately(const Socket_id &amp;socket_id, Peer_socket::Ptr sock, const Error_code &amp;err_code, bool defer_delta_check)</div><div class="ttdoc">Asynchronously send RST to the other side of the given socket and close_connection_immediately().</div><div class="ttdef"><b>Definition:</b> <a href="peer__socket_8cpp_source.html#l05720">peer_socket.cpp:5720</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Peer__socket_html_a6a9bb727c8982f24bcf978c10c2c7345a02dcbe46a8dfde95b9776744dacae189"><div class="ttname"><a href="classflow_1_1net__flow_1_1Peer__socket.html#a6a9bb727c8982f24bcf978c10c2c7345a02dcbe46a8dfde95b9776744dacae189">flow::net_flow::Peer_socket::State::S_OPEN</a></div><div class="ttdeci">@ S_OPEN</div><div class="ttdoc">Future reads or writes may be possible. A socket in this state may be Writable or Readable.</div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Peer__socket_html_a6f48d01d1269c9d4260d972baa40e548a357459237df4b1f8f34e81ce43e2d8fe"><div class="ttname"><a href="classflow_1_1net__flow_1_1Peer__socket.html#a6f48d01d1269c9d4260d972baa40e548a357459237df4b1f8f34e81ce43e2d8fe">flow::net_flow::Peer_socket::Open_sub_state::S_CONNECTED</a></div><div class="ttdeci">@ S_CONNECTED</div><div class="ttdoc">This Peer_socket was created through a passive connect (Node::accept() and the like) or an active con...</div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Peer__socket_html_a6f48d01d1269c9d4260d972baa40e548aae585d03fce4ac2011967830bf0ffbfb"><div class="ttname"><a href="classflow_1_1net__flow_1_1Peer__socket.html#a6f48d01d1269c9d4260d972baa40e548aae585d03fce4ac2011967830bf0ffbfb">flow::net_flow::Peer_socket::Open_sub_state::S_CONNECTING</a></div><div class="ttdeci">@ S_CONNECTING</div><div class="ttdoc">This Peer_socket was created through an active connect (Node::connect() and the like),...</div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Peer__socket_html_a90abde8badaf451ba6ca615e9936d5df"><div class="ttname"><a href="classflow_1_1net__flow_1_1Peer__socket.html#a90abde8badaf451ba6ca615e9936d5df">flow::net_flow::Peer_socket::Lock_guard</a></div><div class="ttdeci">util::Lock_guard&lt; Mutex &gt; Lock_guard</div><div class="ttdoc">Short-hand for RAII lock guard of Mutex.</div><div class="ttdef"><b>Definition:</b> <a href="peer__socket_8hpp_source.html#l00896">peer_socket.hpp:896</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Peer__socket_html_a9537860c2c2a7380a45a525e5121880fa16fdfce85d7bca9386378acd29eb7202"><div class="ttname"><a href="classflow_1_1net__flow_1_1Peer__socket.html#a9537860c2c2a7380a45a525e5121880fa16fdfce85d7bca9386378acd29eb7202">flow::net_flow::Peer_socket::Int_state::S_ESTABLISHED</a></div><div class="ttdeci">@ S_ESTABLISHED</div><div class="ttdoc">Public state is OPEN+CONNECTED; in our opinion the connection is established.</div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Peer__socket_html_a9537860c2c2a7380a45a525e5121880fa6abcbd1be8478aa03e76aec9c540e14f"><div class="ttname"><a href="classflow_1_1net__flow_1_1Peer__socket.html#a9537860c2c2a7380a45a525e5121880fa6abcbd1be8478aa03e76aec9c540e14f">flow::net_flow::Peer_socket::Int_state::S_CLOSED</a></div><div class="ttdeci">@ S_CLOSED</div><div class="ttdoc">Closed (dead or new) socket.</div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Peer__socket_html_a9537860c2c2a7380a45a525e5121880fa9838c717b26793d3b5360e4d718dc2d2"><div class="ttname"><a href="classflow_1_1net__flow_1_1Peer__socket.html#a9537860c2c2a7380a45a525e5121880fa9838c717b26793d3b5360e4d718dc2d2">flow::net_flow::Peer_socket::Int_state::S_SYN_RCVD</a></div><div class="ttdeci">@ S_SYN_RCVD</div><div class="ttdoc">Public state is OPEN+CONNECTING; other side requested passive connect via SYN; we sent SYN_ACK and ar...</div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Port__space_html_a1168841ecd09d3187f9803eac2b8b703"><div class="ttname"><a href="classflow_1_1net__flow_1_1Port__space.html#a1168841ecd09d3187f9803eac2b8b703">flow::net_flow::Port_space::reserve_port</a></div><div class="ttdeci">flow_port_t reserve_port(flow_port_t port, Error_code *err_code)</div><div class="ttdoc">Reserve the specified service port, or reserve_ephemeral_port() if the specified port is S_PORT_ANY.</div><div class="ttdef"><b>Definition:</b> <a href="port__space_8cpp_source.html#l00075">port_space.cpp:75</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Port__space_html_a9fe1be917ff7584ff587b5da5967127a"><div class="ttname"><a href="classflow_1_1net__flow_1_1Port__space.html#a9fe1be917ff7584ff587b5da5967127a">flow::net_flow::Port_space::return_port</a></div><div class="ttdeci">void return_port(flow_port_t port, Error_code *err_code)</div><div class="ttdoc">Return a previously reserved port (of any type).</div><div class="ttdef"><b>Definition:</b> <a href="port__space_8cpp_source.html#l00175">port_space.cpp:175</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Send__bandwidth__estimator_html"><div class="ttname"><a href="classflow_1_1net__flow_1_1Send__bandwidth__estimator.html">flow::net_flow::Send_bandwidth_estimator</a></div><div class="ttdoc">A per-Peer_socket module that tries to estimate the bandwidth available to the outgoing flow.</div><div class="ttdef"><b>Definition:</b> <a href="bandwidth_8hpp_source.html#l00122">bandwidth.hpp:125</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Sequence__number_1_1Generator_html_a06f094532f4be6ab3b69d27ea39b2d4d"><div class="ttname"><a href="classflow_1_1net__flow_1_1Sequence__number_1_1Generator.html#a06f094532f4be6ab3b69d27ea39b2d4d">flow::net_flow::Sequence_number::Generator::generate_init_seq_num</a></div><div class="ttdeci">Sequence_number generate_init_seq_num()</div><div class="ttdoc">Returns an initial sequence number (ISN) for use in a new connection.</div><div class="ttdef"><b>Definition:</b> <a href="seq__num_8cpp_source.html#l00048">seq_num.cpp:48</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Sequence__number_html"><div class="ttname"><a href="classflow_1_1net__flow_1_1Sequence__number.html">flow::net_flow::Sequence_number</a></div><div class="ttdoc">An internal net_flow sequence number identifying a piece of data.</div><div class="ttdef"><b>Definition:</b> <a href="seq__num_8hpp_source.html#l00125">seq_num.hpp:126</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Sequence__number_html_a77ce8cf348e93caa8bb03f22f7b7d120"><div class="ttname"><a href="classflow_1_1net__flow_1_1Sequence__number.html#a77ce8cf348e93caa8bb03f22f7b7d120">flow::net_flow::Sequence_number::set_metadata</a></div><div class="ttdeci">void set_metadata(char num_line_id=0, const Sequence_number &amp;zero_point=Sequence_number(), seq_num_delta_t multiple_size=0)</div><div class="ttdoc">Updates the full set of metadata (used at least for convenient convention-based logging but not actua...</div><div class="ttdef"><b>Definition:</b> <a href="seq__num_8cpp_source.html#l00268">seq_num.cpp:268</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Server__socket_html"><div class="ttname"><a href="classflow_1_1net__flow_1_1Server__socket.html">flow::net_flow::Server_socket</a></div><div class="ttdoc">A server socket able to listen on a single Flow port for incoming connections and return peer sockets...</div><div class="ttdef"><b>Definition:</b> <a href="server__socket_8hpp_source.html#l00118">server_socket.hpp:126</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Server__socket_html_a02ba529163a2d50132eff7aec9d9c9b8"><div class="ttname"><a href="classflow_1_1net__flow_1_1Server__socket.html#a02ba529163a2d50132eff7aec9d9c9b8">flow::net_flow::Server_socket::sync_accept</a></div><div class="ttdeci">Peer_socket_ptr sync_accept(const boost::chrono::duration&lt; Rep, Period &gt; &amp;max_wait, bool reactor_pattern=false, Error_code *err_code=0)</div><div class="ttdoc">Blocking (synchronous) version of accept().</div><div class="ttdef"><b>Definition:</b> <a href="server__socket_8hpp_source.html#l00434">server_socket.hpp:434</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Server__socket_html_a1f48a72439665d8754549f11a4f4c7bb"><div class="ttname"><a href="classflow_1_1net__flow_1_1Server__socket.html#a1f48a72439665d8754549f11a4f4c7bb">flow::net_flow::Server_socket::Server_socket</a></div><div class="ttdeci">Server_socket(log::Logger *logger, const Peer_socket_options *child_sock_opts)</div><div class="ttdoc">Constructs object; initializes most values to well-defined (0, empty, etc.) but not necessarily meani...</div><div class="ttdef"><b>Definition:</b> <a href="server__socket_8cpp_source.html#l00030">server_socket.cpp:30</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Server__socket_html_a40967c1981ffde4f7b75c6bb5e5b279b"><div class="ttname"><a href="classflow_1_1net__flow_1_1Server__socket.html#a40967c1981ffde4f7b75c6bb5e5b279b">flow::net_flow::Server_socket::m_mutex</a></div><div class="ttdeci">Mutex m_mutex</div><div class="ttdoc">This object's mutex.</div><div class="ttdef"><b>Definition:</b> <a href="server__socket_8hpp_source.html#l00397">server_socket.hpp:397</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Server__socket_html_a6ba400221e347613c0d101b19602a3a2"><div class="ttname"><a href="classflow_1_1net__flow_1_1Server__socket.html#a6ba400221e347613c0d101b19602a3a2">flow::net_flow::Server_socket::disconnect_cause</a></div><div class="ttdeci">Error_code disconnect_cause() const</div><div class="ttdoc">The error code that perviously caused state() to become State::S_CLOSED, or success code if state is ...</div><div class="ttdef"><b>Definition:</b> <a href="server__socket_8cpp_source.html#l00064">server_socket.cpp:64</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Server__socket_html_a771900a26d8774a88f1f65b8910cf9d2"><div class="ttname"><a href="classflow_1_1net__flow_1_1Server__socket.html#a771900a26d8774a88f1f65b8910cf9d2">flow::net_flow::Server_socket::m_child_sock_opts</a></div><div class="ttdeci">Peer_socket_options const  *const m_child_sock_opts</div><div class="ttdoc">Either null or the pointer to a copy of the template Peer_socket_options intended for resulting Peer_...</div><div class="ttdef"><b>Definition:</b> <a href="server__socket_8hpp_source.html#l00337">server_socket.hpp:337</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Server__socket_html_a783f81f10b50f62a638aa26b72d49e36"><div class="ttname"><a href="classflow_1_1net__flow_1_1Server__socket.html#a783f81f10b50f62a638aa26b72d49e36">flow::net_flow::Server_socket::m_state</a></div><div class="ttdeci">State m_state</div><div class="ttdoc">See state(). Should be set before user gets access to *this. Must not be modified by non-W threads.</div><div class="ttdef"><b>Definition:</b> <a href="server__socket_8hpp_source.html#l00340">server_socket.hpp:340</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Server__socket_html_a7f374375e95e008cfe0326ecfb27cf3b"><div class="ttname"><a href="classflow_1_1net__flow_1_1Server__socket.html#a7f374375e95e008cfe0326ecfb27cf3b">flow::net_flow::Server_socket::sync_accept_impl</a></div><div class="ttdeci">Peer_socket_ptr sync_accept_impl(const Fine_time_pt &amp;wait_until, bool reactor_pattern, Error_code *err_code)</div><div class="ttdoc">Same as sync_accept() but uses a Fine_clock-based Fine_duration non-template type for implementation ...</div><div class="ttdef"><b>Definition:</b> <a href="server__socket_8cpp_source.html#l00100">server_socket.cpp:100</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Server__socket_html_a8bc789b851677a47d7c0a1aa0c69a997"><div class="ttname"><a href="classflow_1_1net__flow_1_1Server__socket.html#a8bc789b851677a47d7c0a1aa0c69a997">flow::net_flow::Server_socket::State</a></div><div class="ttdeci">State</div><div class="ttdoc">State of a Server_socket.</div><div class="ttdef"><b>Definition:</b> <a href="server__socket_8hpp_source.html#l00131">server_socket.hpp:132</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Server__socket_html_a8bc789b851677a47d7c0a1aa0c69a997a6abcbd1be8478aa03e76aec9c540e14f"><div class="ttname"><a href="classflow_1_1net__flow_1_1Server__socket.html#a8bc789b851677a47d7c0a1aa0c69a997a6abcbd1be8478aa03e76aec9c540e14f">flow::net_flow::Server_socket::State::S_CLOSED</a></div><div class="ttdeci">@ S_CLOSED</div><div class="ttdoc">No accept()s are or will be possible, AND Node has disowned the Server_socket.</div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Server__socket_html_a8bc789b851677a47d7c0a1aa0c69a997aa27ca0689984ee6c6784a9265a678d42"><div class="ttname"><a href="classflow_1_1net__flow_1_1Server__socket.html#a8bc789b851677a47d7c0a1aa0c69a997aa27ca0689984ee6c6784a9265a678d42">flow::net_flow::Server_socket::State::S_CLOSING</a></div><div class="ttdeci">@ S_CLOSING</div><div class="ttdoc">No accept()s are or will be possible, but Node is still finishing up the closing operation.</div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Server__socket_html_a8bc789b851677a47d7c0a1aa0c69a997aebae5ec546409cde4d74d99452d9cc8a"><div class="ttname"><a href="classflow_1_1net__flow_1_1Server__socket.html#a8bc789b851677a47d7c0a1aa0c69a997aebae5ec546409cde4d74d99452d9cc8a">flow::net_flow::Server_socket::State::S_LISTENING</a></div><div class="ttdeci">@ S_LISTENING</div><div class="ttdoc">Future or current accept()s may be possible. A socket in this state may be Acceptable.</div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Server__socket_html_a8e8e3363803b2fe2c862b9fac1dfbb77"><div class="ttname"><a href="classflow_1_1net__flow_1_1Server__socket.html#a8e8e3363803b2fe2c862b9fac1dfbb77">flow::net_flow::Server_socket::m_node</a></div><div class="ttdeci">Node * m_node</div><div class="ttdoc">See node().</div><div class="ttdef"><b>Definition:</b> <a href="server__socket_8hpp_source.html#l00346">server_socket.hpp:346</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Server__socket_html_ab2683ecde1fac2b0a79a957de1a2a8ff"><div class="ttname"><a href="classflow_1_1net__flow_1_1Server__socket.html#ab2683ecde1fac2b0a79a957de1a2a8ff">flow::net_flow::Server_socket::state</a></div><div class="ttdeci">State state() const</div><div class="ttdoc">Current State of the socket.</div><div class="ttdef"><b>Definition:</b> <a href="server__socket_8cpp_source.html#l00052">server_socket.cpp:52</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Server__socket_html_ac36eb28d50496b3f8f1b9790194e825e"><div class="ttname"><a href="classflow_1_1net__flow_1_1Server__socket.html#ac36eb28d50496b3f8f1b9790194e825e">flow::net_flow::Server_socket::m_local_port</a></div><div class="ttdeci">flow_port_t m_local_port</div><div class="ttdoc">See local_port().</div><div class="ttdef"><b>Definition:</b> <a href="server__socket_8hpp_source.html#l00352">server_socket.hpp:352</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Server__socket_html_acafb67ed1f81b90f3b2ab923de4e0525"><div class="ttname"><a href="classflow_1_1net__flow_1_1Server__socket.html#acafb67ed1f81b90f3b2ab923de4e0525">flow::net_flow::Server_socket::~Server_socket</a></div><div class="ttdeci">~Server_socket() override</div><div class="ttdoc">Boring virtual destructor. Note that deletion is to be handled exclusively via shared_ptr,...</div><div class="ttdef"><b>Definition:</b> <a href="server__socket_8cpp_source.html#l00045">server_socket.cpp:45</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Server__socket_html_acd7b6b9c66eee2f3bbf35ac1068b1cb1"><div class="ttname"><a href="classflow_1_1net__flow_1_1Server__socket.html#acd7b6b9c66eee2f3bbf35ac1068b1cb1">flow::net_flow::Server_socket::local_port</a></div><div class="ttdeci">flow_port_t local_port() const</div><div class="ttdoc">The local Flow-protocol port on which this server is or was listening.</div><div class="ttdef"><b>Definition:</b> <a href="server__socket_8cpp_source.html#l00070">server_socket.cpp:70</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Server__socket_html_ad428b65f60ee317aff7a0ad7f7a8f56d"><div class="ttname"><a href="classflow_1_1net__flow_1_1Server__socket.html#ad428b65f60ee317aff7a0ad7f7a8f56d">flow::net_flow::Server_socket::Lock_guard</a></div><div class="ttdeci">util::Lock_guard&lt; Mutex &gt; Lock_guard</div><div class="ttdoc">Short-hand for RAII lock guard of Mutex.</div><div class="ttdef"><b>Definition:</b> <a href="server__socket_8hpp_source.html#l00308">server_socket.hpp:308</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Server__socket_html_ae22e94978d59dfe23559a254349670bd"><div class="ttname"><a href="classflow_1_1net__flow_1_1Server__socket.html#ae22e94978d59dfe23559a254349670bd">flow::net_flow::Server_socket::node</a></div><div class="ttdeci">Node * node() const</div><div class="ttdoc">Node that produced this Server_socket.</div><div class="ttdef"><b>Definition:</b> <a href="server__socket_8cpp_source.html#l00058">server_socket.cpp:58</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Server__socket_html_ae87a97dcfaa0909789b76ef4462d6a0b"><div class="ttname"><a href="classflow_1_1net__flow_1_1Server__socket.html#ae87a97dcfaa0909789b76ef4462d6a0b">flow::net_flow::Server_socket::m_disconnect_cause</a></div><div class="ttdeci">Error_code m_disconnect_cause</div><div class="ttdoc">The Error_code causing this server's move from LISTENING state (if this has occurred); otherwise a cl...</div><div class="ttdef"><b>Definition:</b> <a href="server__socket_8hpp_source.html#l00390">server_socket.hpp:390</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Server__socket_html_aeea8554e23c8d743ca4956c772adbf24"><div class="ttname"><a href="classflow_1_1net__flow_1_1Server__socket.html#aeea8554e23c8d743ca4956c772adbf24">flow::net_flow::Server_socket::accept</a></div><div class="ttdeci">Peer_socket_ptr accept(Error_code *err_code=0)</div><div class="ttdoc">Non-blocking accept: obtain socket for the least recently established not-yet-obtained peer connectio...</div><div class="ttdef"><b>Definition:</b> <a href="server__socket_8cpp_source.html#l00075">server_socket.cpp:75</a></div></div>
<div class="ttc" id="aclassflow_1_1util_1_1Shared__ptr__alias__holder_html_a520b351b1463e585e278c8c7241b8fc8"><div class="ttname"><a href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#a520b351b1463e585e278c8c7241b8fc8">flow::util::Shared_ptr_alias_holder&lt; boost::shared_ptr&lt; Low_lvl_packet &gt; &gt;::const_ptr_cast</a></div><div class="ttdeci">static Const_ptr const_ptr_cast(const From_ptr &amp;ptr_to_cast)</div><div class="ttdoc">Identical to ptr_cast() but adds const-ness (immutability) to the pointed-to type.</div><div class="ttdef"><b>Definition:</b> <a href="shared__ptr__alias__holder_8hpp_source.html#l00155">shared_ptr_alias_holder.hpp:197</a></div></div>
<div class="ttc" id="aclassflow_1_1util_1_1Shared__ptr__alias__holder_html_a55a247bb8fb2ec94b7cbfdd56be65a81"><div class="ttname"><a href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#a55a247bb8fb2ec94b7cbfdd56be65a81">flow::util::Shared_ptr_alias_holder&lt; boost::shared_ptr&lt; Low_lvl_packet &gt; &gt;::ptr_cast</a></div><div class="ttdeci">static Ptr ptr_cast(const From_ptr &amp;ptr_to_cast)</div><div class="ttdoc">Provides syntactic-sugary way to perform a static_pointer_cast&lt;&gt; from a compatible smart pointer type...</div><div class="ttdef"><b>Definition:</b> <a href="shared__ptr__alias__holder_8hpp_source.html#l00142">shared_ptr_alias_holder.hpp:187</a></div></div>
<div class="ttc" id="aclassflow_1_1util_1_1Shared__ptr__alias__holder_html_aa4f1af88393042e60159a3a67f0accbc"><div class="ttname"><a href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">flow::util::Shared_ptr_alias_holder&lt; boost::shared_ptr&lt; Peer_socket &gt; &gt;::Ptr</a></div><div class="ttdeci">boost::shared_ptr&lt; Peer_socket &gt; Ptr</div><div class="ttdoc">Short-hand for ref-counted pointer to mutable values of type Target_type::element_type (a-la T*).</div><div class="ttdef"><b>Definition:</b> <a href="shared__ptr__alias__holder_8hpp_source.html#l00125">shared_ptr_alias_holder.hpp:125</a></div></div>
<div class="ttc" id="aclassflow_1_1util_1_1Shared__ptr__alias__holder_html_aef7998db71c60eeb5d1e3d1a97c14886"><div class="ttname"><a href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aef7998db71c60eeb5d1e3d1a97c14886">flow::util::Shared_ptr_alias_holder&lt; boost::shared_ptr&lt; Server_socket &gt; &gt;::Const_ptr</a></div><div class="ttdeci">Const_target_ptr Const_ptr</div><div class="ttdoc">Short-hand for ref-counted pointer to immutable values of type Target_type::element_type (a-la T cons...</div><div class="ttdef"><b>Definition:</b> <a href="shared__ptr__alias__holder_8hpp_source.html#l00127">shared_ptr_alias_holder.hpp:127</a></div></div>
<div class="ttc" id="acong__ctl_8hpp_html"><div class="ttname"><a href="cong__ctl_8hpp.html">cong_ctl.hpp</a></div></div>
<div class="ttc" id="aerror_2error_8hpp_html_a5d44fa375b0080a95f45f664c0407c72"><div class="ttname"><a href="error_2error_8hpp.html#a5d44fa375b0080a95f45f664c0407c72">FLOW_ERROR_LOG_ERROR</a></div><div class="ttdeci">#define FLOW_ERROR_LOG_ERROR(ARG_val)</div><div class="ttdoc">Logs a warning about the given error code using FLOW_LOG_WARNING().</div><div class="ttdef"><b>Definition:</b> <a href="error_2error_8hpp_source.html#l00233">error.hpp:233</a></div></div>
<div class="ttc" id="aerror_2error_8hpp_html_a636b2d30a8785df6e84646b568bce9b5"><div class="ttname"><a href="error_2error_8hpp.html#a636b2d30a8785df6e84646b568bce9b5">FLOW_ERROR_EXEC_AND_THROW_ON_ERROR</a></div><div class="ttdeci">#define FLOW_ERROR_EXEC_AND_THROW_ON_ERROR(ARG_ret_type, ARG_function_name,...)</div><div class="ttdoc">Narrow-use macro that implements the error code/exception semantics expected of most public-facing Fl...</div><div class="ttdef"><b>Definition:</b> <a href="error_2error_8hpp_source.html#l00363">error.hpp:363</a></div></div>
<div class="ttc" id="aerror_2error_8hpp_html_ab6b8ed79012c994cfc381e0b92c066fd"><div class="ttname"><a href="error_2error_8hpp.html#ab6b8ed79012c994cfc381e0b92c066fd">FLOW_ERROR_EMIT_ERROR</a></div><div class="ttdeci">#define FLOW_ERROR_EMIT_ERROR(ARG_val)</div><div class="ttdoc">Sets *err_code to ARG_val and logs a warning about the error using FLOW_LOG_WARNING().</div><div class="ttdef"><b>Definition:</b> <a href="error_2error_8hpp_source.html#l00202">error.hpp:202</a></div></div>
<div class="ttc" id="aerror_2error_8hpp_html_adc17094d4b9421abd04b90caab8b8e72"><div class="ttname"><a href="error_2error_8hpp.html#adc17094d4b9421abd04b90caab8b8e72">FLOW_ERROR_EMIT_ERROR_LOG_INFO</a></div><div class="ttdeci">#define FLOW_ERROR_EMIT_ERROR_LOG_INFO(ARG_val)</div><div class="ttdoc">Identical to FLOW_ERROR_EMIT_ERROR(), but the message logged has flow::log::Sev::S_INFO severity inst...</div><div class="ttdef"><b>Definition:</b> <a href="error_2error_8hpp_source.html#l00218">error.hpp:218</a></div></div>
<div class="ttc" id="alog_8hpp_html_a325fdd4b5cf0be49b37d3b7b7c29070d"><div class="ttname"><a href="log_8hpp.html#a325fdd4b5cf0be49b37d3b7b7c29070d">FLOW_LOG_INFO</a></div><div class="ttdeci">#define FLOW_LOG_INFO(ARG_stream_fragment)</div><div class="ttdoc">Logs an INFO message into flow::log::Logger *get_logger() with flow::log::Component get_log_component...</div><div class="ttdef"><b>Definition:</b> <a href="log_8hpp_source.html#l00197">log.hpp:197</a></div></div>
<div class="ttc" id="alog_8hpp_html_a626c7dc4d3b4dc0b32a8aac8624d66bc"><div class="ttname"><a href="log_8hpp.html#a626c7dc4d3b4dc0b32a8aac8624d66bc">FLOW_LOG_WARNING</a></div><div class="ttdeci">#define FLOW_LOG_WARNING(ARG_stream_fragment)</div><div class="ttdoc">Logs a WARNING message into flow::log::Logger *get_logger() with flow::log::Component get_log_compone...</div><div class="ttdef"><b>Definition:</b> <a href="log_8hpp_source.html#l00152">log.hpp:152</a></div></div>
<div class="ttc" id="alog_8hpp_html_a692bbadd8b5c3e9cef7a0bbea1915e66"><div class="ttname"><a href="log_8hpp.html#a692bbadd8b5c3e9cef7a0bbea1915e66">FLOW_LOG_WITH_CHECKING</a></div><div class="ttdeci">#define FLOW_LOG_WITH_CHECKING(ARG_sev, ARG_stream_fragment)</div><div class="ttdoc">Logs a message of the specified severity into flow::log::Logger *get_logger() with flow::log::Compone...</div><div class="ttdef"><b>Definition:</b> <a href="log_8hpp_source.html#l00489">log.hpp:489</a></div></div>
<div class="ttc" id="alog_8hpp_html_a6b3b2cd7ddabf90a7c6ccd104a042cc6"><div class="ttname"><a href="log_8hpp.html#a6b3b2cd7ddabf90a7c6ccd104a042cc6">FLOW_LOG_TRACE_WITHOUT_CHECKING</a></div><div class="ttdeci">#define FLOW_LOG_TRACE_WITHOUT_CHECKING(ARG_stream_fragment)</div><div class="ttdoc">Logs a TRACE message into flow::log::Logger *get_logger() with flow::log::Component get_log_component...</div><div class="ttdef"><b>Definition:</b> <a href="log_8hpp_source.html#l00354">log.hpp:354</a></div></div>
<div class="ttc" id="alog_8hpp_html_a9aa1d91ba9eb26345d4b83588ac489cb"><div class="ttname"><a href="log_8hpp.html#a9aa1d91ba9eb26345d4b83588ac489cb">FLOW_LOG_DATA_WITHOUT_CHECKING</a></div><div class="ttdeci">#define FLOW_LOG_DATA_WITHOUT_CHECKING(ARG_stream_fragment)</div><div class="ttdoc">Logs a DATA message into flow::log::Logger *get_logger() with flow::log::Component get_log_component(...</div><div class="ttdef"><b>Definition:</b> <a href="log_8hpp_source.html#l00372">log.hpp:372</a></div></div>
<div class="ttc" id="alog_8hpp_html_affcf2e4c496ce3f42adf981669c623b8"><div class="ttname"><a href="log_8hpp.html#affcf2e4c496ce3f42adf981669c623b8">FLOW_LOG_TRACE</a></div><div class="ttdeci">#define FLOW_LOG_TRACE(ARG_stream_fragment)</div><div class="ttdoc">Logs a TRACE message into flow::log::Logger *get_logger() with flow::log::Component get_log_component...</div><div class="ttdef"><b>Definition:</b> <a href="log_8hpp_source.html#l00227">log.hpp:227</a></div></div>
<div class="ttc" id="anamespaceflow_1_1async_html_a0a06794b16b72f2829ce3353557c8485"><div class="ttname"><a href="namespaceflow_1_1async.html#a0a06794b16b72f2829ce3353557c8485">flow::async::Synchronicity</a></div><div class="ttdeci">Synchronicity</div><div class="ttdoc">Enumeration indicating the manner in which asio_exec_ctx_post(), and various boost....</div><div class="ttdef"><b>Definition:</b> <a href="async__fwd_8hpp_source.html#l00222">async_fwd.hpp:223</a></div></div>
<div class="ttc" id="anamespaceflow_1_1async_html_a24567271e97a67d3cae6bd8bf8dc63c4"><div class="ttname"><a href="namespaceflow_1_1async.html#a24567271e97a67d3cae6bd8bf8dc63c4">flow::async::asio_exec_ctx_post</a></div><div class="ttdeci">void asio_exec_ctx_post(log::Logger *logger_ptr, Execution_context *exec_ctx, Synchronicity synchronicity, Task &amp;&amp;task)</div><div class="ttdoc">An extension of boost.asio's post() and dispatch() free function templates, this free function templa...</div><div class="ttdef"><b>Definition:</b> <a href="async_2util_8hpp_source.html#l00031">util.hpp:31</a></div></div>
<div class="ttc" id="anamespaceflow_1_1log_html_a5c602384e6fe9d7642740ac2fae4ad04a138fe9b2eb78ab00c84b21c4a6b48fed"><div class="ttname"><a href="namespaceflow_1_1log.html#a5c602384e6fe9d7642740ac2fae4ad04a138fe9b2eb78ab00c84b21c4a6b48fed">flow::log::Sev::S_DATA</a></div><div class="ttdeci">@ S_DATA</div><div class="ttdoc">Message satisfies Sev::S_TRACE description AND contains variable-length structure (like packet,...</div></div>
<div class="ttc" id="anamespaceflow_1_1log_html_a5c602384e6fe9d7642740ac2fae4ad04a3ee808b04c34bf6c110e3754de277f7b"><div class="ttname"><a href="namespaceflow_1_1log.html#a5c602384e6fe9d7642740ac2fae4ad04a3ee808b04c34bf6c110e3754de277f7b">flow::log::Sev::S_TRACE</a></div><div class="ttdeci">@ S_TRACE</div><div class="ttdoc">Message indicates any condition that may occur with great frequency (thus verbose if logged).</div></div>
<div class="ttc" id="anamespaceflow_1_1log_html_a5c602384e6fe9d7642740ac2fae4ad04ac238793326fae17afcc849e96b96e8e7"><div class="ttname"><a href="namespaceflow_1_1log.html#a5c602384e6fe9d7642740ac2fae4ad04ac238793326fae17afcc849e96b96e8e7">flow::log::Sev::S_INFO</a></div><div class="ttdeci">@ S_INFO</div><div class="ttdoc">Message indicates a not-&quot;bad&quot; condition that is not frequent enough to be of severity Sev::S_TRACE.</div></div>
<div class="ttc" id="anamespaceflow_1_1net__flow_1_1error_html_a18e13de77b119ea0f2be411490859482ab2c97d0fbc585d3726ec79c7802da891"><div class="ttname"><a href="namespaceflow_1_1net__flow_1_1error.html#a18e13de77b119ea0f2be411490859482ab2c97d0fbc585d3726ec79c7802da891">flow::net_flow::error::Code::S_CONN_RESET_BAD_PEER_BEHAVIOR</a></div><div class="ttdeci">@ S_CONN_RESET_BAD_PEER_BEHAVIOR</div><div class="ttdoc">Connection reset because of unexpected/illegal behavior by the other side.</div></div>
<div class="ttc" id="anamespaceflow_1_1net__flow_1_1error_html_a18e13de77b119ea0f2be411490859482ae90ff1c87f2393dd6b14232b159f02b2"><div class="ttname"><a href="namespaceflow_1_1net__flow_1_1error.html#a18e13de77b119ea0f2be411490859482ae90ff1c87f2393dd6b14232b159f02b2">flow::net_flow::error::Code::S_INTERNAL_ERROR_PORT_COLLISION</a></div><div class="ttdeci">@ S_INTERNAL_ERROR_PORT_COLLISION</div><div class="ttdoc">Internal error: Ephemeral port double reservation allowed.</div></div>
<div class="ttc" id="anamespaceflow_1_1net__flow_1_1error_html_a18e13de77b119ea0f2be411490859482affac5d80b4e72f2e55bbbfadce2efd2e"><div class="ttname"><a href="namespaceflow_1_1net__flow_1_1error.html#a18e13de77b119ea0f2be411490859482affac5d80b4e72f2e55bbbfadce2efd2e">flow::net_flow::error::Code::S_NODE_NOT_RUNNING</a></div><div class="ttdeci">@ S_NODE_NOT_RUNNING</div><div class="ttdoc">Node not running.</div></div>
<div class="ttc" id="anamespaceflow_1_1net__flow_html"><div class="ttname"><a href="namespaceflow_1_1net__flow.html">flow::net_flow</a></div><div class="ttdoc">Flow module containing the API and implementation of the Flow network protocol, a TCP-inspired stream...</div><div class="ttdef"><b>Definition:</b> <a href="asio_2node_8cpp_source.html#l00024">node.cpp:25</a></div></div>
<div class="ttc" id="anamespaceflow_1_1net__flow_html_a079d8cd87a68d1c5f04c6bce71f0061d"><div class="ttname"><a href="namespaceflow_1_1net__flow.html#a079d8cd87a68d1c5f04c6bce71f0061d">flow::net_flow::flow_port_t</a></div><div class="ttdeci">uint16_t flow_port_t</div><div class="ttdoc">Logical Flow port type (analogous to a UDP/TCP port in spirit but in no way relevant to UDP/TCP).</div><div class="ttdef"><b>Definition:</b> <a href="net__flow__fwd_8hpp_source.html#l00054">net_flow_fwd.hpp:54</a></div></div>
<div class="ttc" id="anamespaceflow_1_1net__flow_html_a9dd0c9d8de00fab78d8b0a3f50dad2a9"><div class="ttname"><a href="namespaceflow_1_1net__flow.html#a9dd0c9d8de00fab78d8b0a3f50dad2a9">flow::net_flow::S_PORT_ANY</a></div><div class="ttdeci">const flow_port_t S_PORT_ANY</div><div class="ttdoc">Special Flow port value used to indicate &quot;invalid port&quot; or &quot;please pick a random available ephemeral ...</div><div class="ttdef"><b>Definition:</b> <a href="port__space_8cpp_source.html#l00033">port_space.cpp:33</a></div></div>
<div class="ttc" id="anamespaceflow_1_1net__flow_html_ab9f537c84f77e9b8fa742fc5dc6d5693"><div class="ttname"><a href="namespaceflow_1_1net__flow.html#ab9f537c84f77e9b8fa742fc5dc6d5693">flow::net_flow::operator&lt;&lt;</a></div><div class="ttdeci">std::ostream &amp; operator&lt;&lt;(std::ostream &amp;os, const Congestion_control_selector::Strategy_choice &amp;strategy_choice)</div><div class="ttdoc">Serializes a Peer_socket_options::Congestion_control_strategy_choice enum to a standard ostream – the...</div><div class="ttdef"><b>Definition:</b> <a href="cong__ctl_8cpp_source.html#l00146">cong_ctl.cpp:146</a></div></div>
<div class="ttc" id="anamespaceflow_1_1util_html_a03984e29450abf9cf287c501d6c8f866"><div class="ttname"><a href="namespaceflow_1_1util.html#a03984e29450abf9cf287c501d6c8f866">flow::util::key_exists</a></div><div class="ttdeci">bool key_exists(const Container &amp;container, const typename Container::key_type &amp;key)</div><div class="ttdoc">Returns true if and only if the given key is present at least once in the given associative container...</div><div class="ttdef"><b>Definition:</b> <a href="util_2util_8hpp_source.html#l00301">util.hpp:301</a></div></div>
<div class="ttc" id="anamespaceflow_1_1util_html_af09888b3a8feaff209b6625e493bc338"><div class="ttname"><a href="namespaceflow_1_1util.html#af09888b3a8feaff209b6625e493bc338">flow::util::Blob</a></div><div class="ttdeci">Blob_with_log_context&lt;&gt; Blob</div><div class="ttdoc">A concrete Blob_with_log_context that compile-time-disables Basic_blob::share() and the sharing API d...</div><div class="ttdef"><b>Definition:</b> <a href="blob__fwd_8hpp_source.html#l00060">blob_fwd.hpp:60</a></div></div>
<div class="ttc" id="anamespaceflow_1_1util_html_af1b28edb7bad743c1c77f6b982cc3196"><div class="ttname"><a href="namespaceflow_1_1util.html#af1b28edb7bad743c1c77f6b982cc3196">flow::util::Udp_endpoint</a></div><div class="ttdeci">boost::asio::ip::udp::endpoint Udp_endpoint</div><div class="ttdoc">Short-hand for the UDP endpoint (IP/port) type.</div><div class="ttdef"><b>Definition:</b> <a href="util__fwd_8hpp_source.html#l00208">util_fwd.hpp:208</a></div></div>
<div class="ttc" id="anamespaceflow_html_a29eaaa9d0fac4ce87d8b969222dbed09"><div class="ttname"><a href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09">flow::Error_code</a></div><div class="ttdeci">boost::system::error_code Error_code</div><div class="ttdoc">Short-hand for a boost.system error code (which basically encapsulates an integer/enum error code and...</div><div class="ttdef"><b>Definition:</b> <a href="common_8hpp_source.html#l00508">common.hpp:508</a></div></div>
<div class="ttc" id="anamespaceflow_html_a3938730ab4b89daf13d027a5f620e7ce"><div class="ttname"><a href="namespaceflow.html#a3938730ab4b89daf13d027a5f620e7ce">flow::Flow_log_component</a></div><div class="ttdeci">Flow_log_component</div><div class="ttdoc">The flow::log::Component payload enumeration comprising various log components used by Flow's own int...</div><div class="ttdef"><b>Definition:</b> <a href="common_8hpp_source.html#l00637">common.hpp:638</a></div></div>
<div class="ttc" id="anamespaceflow_html_a9d9cc2eeb10d398cff5591d446b763b8"><div class="ttname"><a href="namespaceflow.html#a9d9cc2eeb10d398cff5591d446b763b8">flow::Fine_time_pt</a></div><div class="ttdeci">Fine_clock::time_point Fine_time_pt</div><div class="ttdoc">A high-res time point as returned by Fine_clock::now() and suitable for precise time math in general.</div><div class="ttdef"><b>Definition:</b> <a href="common_8hpp_source.html#l00413">common.hpp:413</a></div></div>
<div class="ttc" id="anode_8hpp_html"><div class="ttname"><a href="node_8hpp.html">node.hpp</a></div></div>
<div class="ttc" id="apeer__socket_8hpp_html"><div class="ttname"><a href="peer__socket_8hpp.html">peer_socket.hpp</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Node_1_1Socket__id_html"><div class="ttname"><a href="structflow_1_1net__flow_1_1Node_1_1Socket__id.html">flow::net_flow::Node::Socket_id</a></div><div class="ttdoc">The data nugget uniquely identifying a peer-to-peer connection from a remote endpoint to a port in th...</div><div class="ttdef"><b>Definition:</b> <a href="node_8hpp_source.html#l03861">node.hpp:3862</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Node__options_html_a71b56a75a4b6dba57daeef79b0b880f7"><div class="ttname"><a href="structflow_1_1net__flow_1_1Node__options.html#a71b56a75a4b6dba57daeef79b0b880f7">flow::net_flow::Node_options::m_dyn_sock_opts</a></div><div class="ttdeci">Peer_socket_options m_dyn_sock_opts</div><div class="ttdoc">The set of per-Peer_socket options in this per-Node set of options.</div><div class="ttdef"><b>Definition:</b> <a href="options_8hpp_source.html#l00580">options.hpp:580</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Peer__socket__options_html"><div class="ttname"><a href="structflow_1_1net__flow_1_1Peer__socket__options.html">flow::net_flow::Peer_socket_options</a></div><div class="ttdoc">A set of low-level options affecting a single Peer_socket.</div><div class="ttdef"><b>Definition:</b> <a href="options_8hpp_source.html#l00035">options.hpp:36</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Remote__endpoint_html"><div class="ttname"><a href="structflow_1_1net__flow_1_1Remote__endpoint.html">flow::net_flow::Remote_endpoint</a></div><div class="ttdoc">Represents the remote endpoint of a Flow-protocol connection; identifies the UDP endpoint of the remo...</div><div class="ttdef"><b>Definition:</b> <a href="endpoint_8hpp_source.html#l00092">endpoint.hpp:93</a></div></div>
</div><!-- fragment --></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Fri Mar 28 2025 22:55:35 for Flow by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.4
</small></address>
</body>
</html>
